線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1445
推到 Plurk!
推到 Facebook!

不需要檔案配置表來存取檔案API

尚未結案
lukyshu
中階會員


發表:16
回覆:120
積分:93
註冊:2002-04-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-24 13:48:41 IP:211.20.xxx.xxx 未訂閱
不知道有沒有API可以用來讀取或寫入磁碟,但是檔案 資料又不要寫入檔案配置表中呢? 目的是讓一般的檔案工具無法看見也無法讀取!    台灣 Delphi 俱樂部
PostgreSQL、FastReport專業討論區
http://www.delphi.club.tw


------
台灣 Delphi 俱樂部 

PostgreSQL、FastReport專業討論區

http://www.delphi.club.tw

Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-25 08:59:17 IP:211.23.xxx.xxx 未訂閱
引言: 不知道有沒有API可以用來讀取或寫入磁碟,但是檔案 資料又不要寫入檔案配置表中呢? 目的是讓一般的檔案工具無法看見也無法讀取! 台灣 Delphi 俱樂部
PostgreSQL、FastReport專業討論區
http://www.delphi.club.tw


沒有, 如果這麼簡單就能達成隱藏檔案的話, 那市面上那些有相似功能的軟體就不用賣了, 隱藏檔案的技術沒這麼簡單...
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-25 13:07:51 IP:61.64.xxx.xxx 未訂閱
你這樣跟先建一個檔 然後寫入資料 接著將之刪除    有什麼不同?    不存在檔案配置表的區塊,都會作業系統認為是可用空間 就算你真的做出來,那你也要天天擔心,不知資料何時會被覆蓋
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-26 00:11:42 IP:203.69.xxx.xxx 未訂閱
它可以先把 FAT 那一塊標成 BAD 這樣作業系統就用不到了。^_^
alanktop
一般會員


發表:7
回覆:21
積分:5
註冊:2005-03-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-26 10:13:15 IP:218.17.xxx.xxx 未訂閱
暗黑大大说得很对,标记为BAD是可以躲过操作系统的读写的,于是你自己的程序可以放心的直接进行读写了。    还有一个简单方法,你可以单独分一个小的NTFS格式磁盘分区,将这个分区的安全所属帐号全部拿掉,包括Administrator,于是任何程序都对该分区没有读写能力。但是剩下的工作是,你必须清楚地计算该分区的磁道、扇区范围。    下面这个例子是对磁盘直接底层读写的方式,仅供参考:    unit Unit1;    interface    uses   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,   StdCtrls;    type   TForm1 = class(TForm)     Button1: TButton;     Button2: TButton;     procedure Button1Click(Sender: TObject);     procedure Button2Click(Sender: TObject);   private     { Private declarations }   public     { Public declarations }   end;    var   Form1: TForm1;   hDeviceHandle: Thandle;    implementation    {$R *.DFM}    procedure TForm1.Button1Click(Sender: TObject); const   BytesPerSector=512;   SectorCount=1;   SectorStart=0;   drive='\\.\C:'; var   str:string;   p:pchar;   i:Cardinal; begin   hDeviceHandle := CreateFile(drive, GENERIC_ALL,  //如果只是读扇区,可以用GENERIC_READ     FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,0, 0);   if (hDeviceHandle <> INVALID_HANDLE_VALUE) then   begin     p:=allocmem(SectorCount*BytesPerSector);        FileSeek(hDevicehandle,SectorStart*BytesPerSector,0);     if FileRead(hDevicehandle,p[0],SectorCount*BytesPerSector)<>SectorCount*BytesPerSector then        raise exception.create('Read错误');        str:='';     for i:=0 to 512-1 do     begin       str:=str+format('%.2x',[integer(p[i])]);       if i mod 16=15 then str:=str+#13;     end;     showmessage(str);        FileSeek(hDevicehandle,SectorStart*BytesPerSector,0);     if FileWrite(hDevicehandle,p[0],SectorCount*BytesPerSector)<>SectorCount*BytesPerSector then        raise exception.create('Write错误%d');        freemem(p,SectorCount*BytesPerSector);     closehandle(hDeviceHandle);   end; end;    procedure TForm1.Button2Click(Sender: TObject); const   BytesPerSector=512;   SectorCount=1;   SectorStart=0;   drive='\\.\PHYSICALDRIVE0'; var   str:string;   p:pchar;   i:Cardinal; begin   hDeviceHandle := CreateFile(drive, GENERIC_ALL,  //如果只是读扇区,可以用GENERIC_READ     FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,0, 0);   if (hDeviceHandle <> INVALID_HANDLE_VALUE) then   begin     p:=allocmem(SectorCount*BytesPerSector);        FileSeek(hDevicehandle,SectorStart*BytesPerSector,0);     if FileRead(hDevicehandle,p[0],SectorCount*BytesPerSector)<>SectorCount*BytesPerSector then        raise exception.create('Read错误');        str:='';     for i:=0 to 512-1 do     begin       str:=str+format('%.2x',[integer(p[i])]);       if i mod 16=15 then str:=str+#13;     end;     showmessage(str);        FileSeek(hDevicehandle,SectorStart*BytesPerSector,0);     if FileWrite(hDevicehandle,p[0],SectorCount*BytesPerSector)<>SectorCount*BytesPerSector then        raise exception.create('Write错误%d');        freemem(p,SectorCount*BytesPerSector);     closehandle(hDeviceHandle);   end; end;    end.    
alanktop
一般會員


發表:7
回覆:21
積分:5
註冊:2005-03-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-26 10:20:22 IP:218.17.xxx.xxx 未訂閱
直接通过API完全达到你提出的要求应该是不大可能,我想微软不会提供这样API供用户使用的;否则就不会有FolderGuard这种非常专业的软件了。 但是FolderGuard做出的效果的确不同凡响,既可以将某个文件夹设为只读,还可以将其彻底隐藏,并且隐藏后既不会被操作系统发现,也不会被操作系统的正常读写破坏。 不太清楚具体是如何实现的,但是可以看出,决不是几个简单的API就能搞定的。
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-26 12:53:17 IP:61.64.xxx.xxx 未訂閱
引言: 它可以先把 FAT 那一塊標成 BAD 這樣作業系統就用不到了。^_^
是阿,那到時要是有硬碟相關錯誤的話,就有得瞧囉~看是真的壞了,還是資料區? 更不可能跑 chkdsk 與諾頓相關硬碟軟體,不然....嘿嘿
alanktop
一般會員


發表:7
回覆:21
積分:5
註冊:2005-03-01

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-26 21:17:07 IP:218.17.xxx.xxx 未訂閱
syntax大大所言极是,标记为BAD看来不太好,可能会与磁盘扫描、某些第三方软件不兼容! 更改文件夹的安全属性要可靠得多。 不过即使Folder Guard这么专业的软件,也有一个问题,那就是把这个硬盘取下挂到另外的机器上,硬盘上被锁的数据就一览无余了。其实它并未改变文件分配表,只是改变了文件夹的显示及安全属性。仅仅对当前的操作系统有效,对于未安装Folder Guard的操作系统来讲,那些文件夹的内容还是原样没有变化的。
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-03-26 23:11:45 IP:220.132.xxx.xxx 未訂閱
Hi, 插個花, 若是因為安全性考量的話, 可以考慮加密檔案也是一種作法!
系統時間:2024-04-29 6:11:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!