同时读写文件 ( 积分: 100 )

  • 主题发起人 主题发起人 travelty
  • 开始时间 开始时间
T

travelty

Unregistered / Unconfirmed
GUEST, unregistred user!
var F: TextFile;<br>begin &nbsp;//写文件<br> &nbsp;…………<br> &nbsp;AssignFile(F, ResultFile);<br> &nbsp; &nbsp;if not FileExists(ResultFile) then<br> &nbsp; &nbsp; &nbsp;Rewrite(F)<br> &nbsp; &nbsp;else<br> &nbsp; &nbsp; &nbsp;Append(F);<br> &nbsp; &nbsp;writeln(F, FileName);<br> &nbsp; &nbsp;CloseFile(F);<br> &nbsp;…………<br>end<br><br>begin &nbsp;//读文件<br>AssignFile(F, _Name);<br> &nbsp; &nbsp;FileMode := 0;<br> &nbsp; &nbsp;Reset(F);<br> &nbsp; &nbsp;while not Eof(F) do<br> &nbsp; &nbsp; &nbsp;Readln(F, s);<br>end<br><br>这两段程序操作的都是同一个文件,有可能正在读时,又开始写,或者正在写时又开始读,他们之间会不会发生冲突,假如发生了冲突要怎么解决?其中reset好像是以独占方式打开文件,他的filemode:=2,我改成了0(共享方式),但就不知使用append打开文件时他会不会关闭该文件的所有指针?假如要关闭,有没有方法使append可以写,而其他地方同时可以读的方式来打开?<br>
 
var F: TextFile;<br>begin &nbsp;//写文件<br> &nbsp;…………<br> &nbsp;AssignFile(F, ResultFile);<br> &nbsp; &nbsp;if not FileExists(ResultFile) then<br> &nbsp; &nbsp; &nbsp;Rewrite(F)<br> &nbsp; &nbsp;else<br> &nbsp; &nbsp; &nbsp;Append(F);<br> &nbsp; &nbsp;writeln(F, FileName);<br> &nbsp; &nbsp;CloseFile(F);<br> &nbsp;…………<br>end<br><br>begin &nbsp;//读文件<br>AssignFile(F, _Name);<br> &nbsp; &nbsp;FileMode := 0;<br> &nbsp; &nbsp;Reset(F);<br> &nbsp; &nbsp;while not Eof(F) do<br> &nbsp; &nbsp; &nbsp;Readln(F, s);<br>end<br><br>这两段程序操作的都是同一个文件,有可能正在读时,又开始写,或者正在写时又开始读,他们之间会不会发生冲突,假如发生了冲突要怎么解决?其中reset好像是以独占方式打开文件,他的filemode:=2,我改成了0(共享方式),但就不知使用append打开文件时他会不会关闭该文件的所有指针?假如要关闭,有没有方法使append可以写,而其他地方同时可以读的方式来打开?<br>
 
当然会冲突,怎么能又读又写,要想解决使用进程createmutex处理,读的时候不能写,写的时候不能读
 
应该写的时候可以读吧?
 
http://www.delphibbs.com/delphibbs/dispq.asp?LID=2980137<br>100分求一个简单问题,关于打开文件
 
同意travelty
 
处理文本的时候用TStrings类是最为方便的,<br>用loadfilefrom可以直接载入文件,操作好后,再用Savefileto<br>很少会发生冲突的事,而且对每行进行操作非常灵活,我简直百试不爽,推荐使用.<br>想要看效果用的memo控件操作,其Lines本质就是一个TStrings,可以直接看到操作的效果
 
[red]冲突冲突冲突冲突冲突冲突冲突冲突冲突[/red]
 
如果你的意思是写操作仅仅局限于append添加,并且你的这两段代码是在同一进程,那么通过一些技巧来实现同时读写没有问题,因为他们读写的不是同一段数据。需要你自己实现一个类来管理文件的读写。<br>而如果你的写文件全都是WriteLine,那么使用一个线程安全的StringList就可以了
 
写的时候是可以读,问题是读到的是旧的不是正在写入的,读他干嘛
 
如果多线程,用同步吧,没什么好说的<br>如果单线程,可以不管.<br>
 
是用如下的方法<br> fHttp.RcvdStream := TFileStream.Create(DocFileName, fmOpenReadWrite Or<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fmShareDenyNone);<br> fHttp.RcvdStream.Seek(fStartPos, soFromBeginning);<br>当多线程写此文件的时候,注意不要写在同一个位置,就没有问题.<br>
 
后退
顶部