这个问题无法解决说明WINDOWS的文件系统设计有问题 ( 积分: 50 )

  • 主题发起人 主题发起人 我爱PASCAL
  • 开始时间 开始时间

我爱PASCAL

Unregistered / Unconfirmed
GUEST, unregistred user!
如何将一个文件的后半部分不要了,只要前半部分<br>不能重新创建一个新文件。
 
可以啊,直接修改fat表即可。
 
如何改,用什么API函数,请速讲,我要下了
 
简单。<br><br>procedure&nbsp;HaltFile(fn:&nbsp;string);<br>var<br>&nbsp;&nbsp;ff:&nbsp;TMemoryStream;<br>begin<br>&nbsp;&nbsp;ff:=&nbsp;TMemoryStream.Create;<br>&nbsp;&nbsp;ff.LoadFromFile(fn);<br>&nbsp;&nbsp;ff.Size:=&nbsp;ff.Size&nbsp;shr&nbsp;1;<br>&nbsp;&nbsp;ff.SaveToFile(fn);<br>&nbsp;&nbsp;ff.Free;<br>end;
 
再贴点资料,其他更具体的修改fat表哪些内容来截断文件,自己找资料,网上有的。<br>&nbsp;读、写win2k的分区表(转贴)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;给你个读的例子,写的没敢试验,因为我只有一个hd.[:d]&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;procedure&nbsp;&nbsp;&nbsp;tform1.button1click(sender:&nbsp;&nbsp;&nbsp;tobject);&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;var&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hfile:thandle&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytesread:dword;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf:&nbsp;&nbsp;&nbsp;array[0..511]&nbsp;&nbsp;&nbsp;of&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;security:&nbsp;&nbsp;&nbsp;tsecurityattributes;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;begin&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;hfile:=createfile(//./physicaldrive0,generic_read,&nbsp;&nbsp;&nbsp;file_share_read&nbsp;&nbsp;&nbsp;or&nbsp;&nbsp;&nbsp;file_share_write,&nbsp;&nbsp;&nbsp;nil&nbsp;&nbsp;&nbsp;,open_existing,file_flag_sequential_scan,0);&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;&nbsp;hfile=invalid_handle_value&nbsp;&nbsp;&nbsp;then&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showmessage(no&nbsp;&nbsp;&nbsp;file&nbsp;&nbsp;&nbsp;exists&nbsp;&nbsp;&nbsp;yet.&nbsp;&nbsp;&nbsp;);&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;&nbsp;not&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readfile(hfile,&nbsp;&nbsp;&nbsp;buf,&nbsp;&nbsp;&nbsp;sizeof(buf),&nbsp;&nbsp;&nbsp;bytesread,&nbsp;&nbsp;&nbsp;nil)&nbsp;&nbsp;&nbsp;then&nbsp;&nbsp;&nbsp;showmessage(error);&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;end;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;-----------------------------------------&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;四、win2000中的磁盘扇区读写&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在winnt和win2000中磁盘被看做一种标准设备,可以使用createfile象打开文件一样打开并存取。createfile支持两种方式的磁盘设备--逻辑磁盘和物理磁盘,例如打开a:盘进行读取操作,只要这样:&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handle&nbsp;&nbsp;&nbsp;hdev=createfile(&quot;////.//a:&quot;,generic_read,file_share_write,0,open_existing,0,0);&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;如果得到的句柄有效,就可以使用readfile来读取了,&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readfile(hdev,buffer,512,&amp;dwret,0);&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;读取结束要关闭该句柄,&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closehandle(hdev);&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;这比win95/98下的磁盘扇区读取方便多了。&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;另外,上面的例子是操作逻辑磁盘的,它包括软驱、硬盘分区等;物理磁盘指的是实际的硬盘,它不关心该硬盘被分成几个区,硬盘的编号是从0开始的,&quot;//./physicaldrive0&quot;表示第一块硬盘,其它依此类推。大家可能马上会想起,利用这种机制可以对硬盘的分区表进行存取了。确实如此,此时便可以对硬盘的主引导扇区进行操作了。&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;buffer[512]={0};&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handle&nbsp;&nbsp;&nbsp;hdev=createfile(&quot;////.//physicaldrive0&quot;,generic_write,file_share_write,0,open_existing,0,0);&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefile(hdev,buffer,512,&amp;dwret,0);&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closehandle(hdev);
 
&gt;&gt;如何将一个文件的后半部分不要了,只要前半部分<br><br>就这个描述而言,一个API就能解决问题,SetEndOfFile。用类对象也容易,很少几行就可以解决问题。<br><br>假设有个文件有1000个字节,现在我只需要前面的500个字节,后面的500个抛弃,写如下几行代码即可:<br>with&nbsp;TFileStream.Create('c:/myfile.txt',&nbsp;fmOpenRead&nbsp;or&nbsp;fmOpenWrite)&nbsp;do<br>try<br>&nbsp;&nbsp;Size&nbsp;:=&nbsp;500;<br>finally<br>&nbsp;&nbsp;Free;<br>end;<br>OK!
 
楼上的不错,我回去看API书也找到了,试了就是SetEndOfFile,完全成功<br>另外是不增大文件也要用这个函数?
 
SetEndOfFile是把当前文件的指针位置设置为文件结尾,应该是直接操作fat的。<br>看了一下win2000源码,SetEndOfFile实现在&nbsp;filehops.c&nbsp;文件内,<br>SetEndOfFile最后调用了ntdll内的NtSetInformationFile函数<br>估计你直接调用NtSetInformationFile函数可以实现文件增大
 
明明是自己没找到API,还说Windows的文件系统有问题,晕倒啊...<br>&nbsp;&nbsp;看起来楼主向来都是非常的理直气壮——哪怕是自己已经证明自己明明错了的情况下:P<br><br><br>&nbsp;&nbsp;帮助里对&nbsp;SetEndOfFile&nbsp;的功能已经说的很清楚了:<br>&nbsp;&nbsp;This&nbsp;function&nbsp;can&nbsp;be&nbsp;used&nbsp;to&nbsp;truncate&nbsp;or&nbsp;extend&nbsp;a&nbsp;file.&nbsp;If&nbsp;the&nbsp;file&nbsp;is&nbsp;<br>extended,&nbsp;the&nbsp;contents&nbsp;of&nbsp;the&nbsp;file&nbsp;between&nbsp;the&nbsp;old&nbsp;EOF&nbsp;position&nbsp;and&nbsp;the&nbsp;new&nbsp;<br>position&nbsp;are&nbsp;not&nbsp;defined.
 
幫頂。。。。:)
 
增大文件我用的是<br>fileseek到文件尾然后再<br>filewrite增加部分
 
多人接受答案了。
 
后退
顶部