::如何在文件中删除一段数据或插入一段数据:: ( 积分: 200 )

  • 主题发起人 主题发起人 vvyang
  • 开始时间 开始时间
V

vvyang

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,有一个文本文件,我想删除其中某一位置特定长度的数据,或者在某一位置插入一段数据,不知大家有什么好的办法?<br>1、这个文件是用 CreateFile 打开的,不要用 Delphi 提供的 AssignFile、Reset 之类的,只能用 API,原因别问了;<br>2、我只知道把数据重新拼接起来再写回去可以实现,不知道有没有现成的函数可以不那么麻烦?<br>3、对于删除一段数据,我试过用 #0 填充这段区域,结果在文本文件中 #0 都显示成了空格。
 
如题,有一个文本文件,我想删除其中某一位置特定长度的数据,或者在某一位置插入一段数据,不知大家有什么好的办法?<br>1、这个文件是用 CreateFile 打开的,不要用 Delphi 提供的 AssignFile、Reset 之类的,只能用 API,原因别问了;<br>2、我只知道把数据重新拼接起来再写回去可以实现,不知道有没有现成的函数可以不那么麻烦?<br>3、对于删除一段数据,我试过用 #0 填充这段区域,结果在文本文件中 #0 都显示成了空格。
 
不知道楼主的题意中是否可以用文件流方式操作文件?
 
可以,流可以进行插入和删除,但流的创建和操做用 API 写。
 
3、对于删除一段数据,我试过用 #0 填充这段区域,结果在文本文件中 #0 都显示成了空格。<br>用00 填充那段区域呢<br>在硬盘中没有数据应该是存的00
 
To 楼上:<br>我是一个字节一个字节填充的,00 和 #0 有何区别?
 
这个不是很清楚<br>我只知道在delphi 中#0表示为空<br>但具体在硬盘上用什么表示就不知道了<br><br>但如果你用CreateFile打开文件,就直接用00填充就一定可以的<br>因为没有数据在硬盘上就是00<br><br>你可以用WinHex 看一下 #0,在硬盘中是怎么表示的~~
 
fs := TFileStream.Create(filename, fmOpenRead);<br> &nbsp;tmp := TMemoryStream.Create;<br> &nbsp;tmp.LoadFromStream(fs);<br> &nbsp;tmp.Position := 10;<br> &nbsp;tmp.Write('000000',6);<br> &nbsp;tmp.SaveToFile(filename2);<br> &nbsp;tmp.Free;<br> &nbsp;fs.Free;
 
TFileStream 是 Delphi 的东西,在别的语言中不能用。<br>system.pas 单元中有 Delphi 实现文件操作的函数源码,基本都是把 API 包装了一下,太他妈乱了,没时间看了。<br>哪位再帮我一把。
 
做成DLL不就行了。
 
鳄鱼和其他同志再想想办法。<br>我目前用重新写回文件的方法能够达到目的。“如何在文件中插入一行”这类问题有 N + 1 个人问过,有没有更好的解决办法?
 
插入: 将被插位置后面的所有内容后移腾出足够的空位, 然后再将插入的内容写入空位中<br>删除: 将被删除内容后面的所有内容前移以覆盖被删除内容, 然后重新设置文件大小<br><br>除此之外没有第二条路(用stream 其实内部也是这么实现的)
 
To Another_eYes:<br> &nbsp;如何设置文件大小,好像只有 GetFileSize,没有 SetFileSize。例如要缩减文件的长度,怎么办?<br> &nbsp;其他几个兄弟也帮忙看看,搞定咱好把分分了。
 
用Seek把指针移到相应的字节处,再用SetEndOfFile()API作一个文件结束标记。<br>CloseHandle后文件就小了。。。
 
搞定了,多谢诸位。不过移动指针是用 SetFilePointer 不是 Seek。
 
呵呵,那是用Api,也可以用FileSeek的,当然其实也是调用了SetFilePointer。。。。
 
后退
顶部