如果我已经创建了文本文件,那么我需要删除文本文件中的所有行以获取新的新文本。我们怎么做?当然,不首先删除文本文件然后创建新文本文件,只需删除文本文件内容然后添加新的行文本。当显示器前面的人仍然打开该文本文件时,避免错误。
我使用的是TextFile类型,而不是TFileStream。附加,重写和关闭文件功能以打开文件。
就像
一样DeleteThisTextFileContent(ExtractFilePath(Application.Exename)+'log.txt');
谢谢!
答案 0 :(得分:7)
如果您正在使用AssignFile
打开文件(因为您的修改似乎是这样),您可以使用Rewrite
:
procedure DeleteThisFileContent(const FileToClear: string);
var
F: TextFile;
begin
AssignFile(F, FileToClear);
Rewrite(F);
CloseFile(F);
end;
答案 1 :(得分:1)
在我看来,topicstarter与他想要的以及系统中会发生的事情有些混淆。
声明是:我需要删除...文件的内容...而不先删除文件然后再创建一个新文件。当显示器前面的人仍然打开该文本文件时,避免错误。只需删除文件内容,然后添加新的行文字。
然而,其他一些答案使用ReWrite
- 因为最老的Turbo Pascal 1.0 - 确实完成了主题放大器声称他想要避免的内容 - 删除旧文件。
如果已存在具有相同名称的外部文件,则会将其删除,并在其位置创建新的空文件。
http://docwiki.embarcadero.com/Libraries/XE2/en/System.Rewrite
好吧,因为删除文件对于主题启动者是可以的,所以我想提供一些更简单的方法来做 - 很少有oneliners。
使用http://jcl.sf.net的那个是
procedure DeleteThisFileContent(const FileToClear: TFileName);
begin
JclStringList.SaveToFile(FileToClear);
end;
一个,使用股票Delphi是
procedure DeleteThisFileContent(const FileToClear: TFileName);
begin
TFileStream.Create( FileToClear, fmCreate ).Free;
end;
fmCreate
:创建一个具有给定名称的文件。如果存在具有给定名称的文件,请覆盖现有文件并以写入模式打开它。
http://docwiki.embarcadero.com/Libraries/XE2/en/System.Classes.TFileStream.Create
这与ReWrite
执行相同的删除 - 创建序列,但需要更少的样板。
我相信主题启动者可以使用www.SysInternals.com
中的进程监视器轻松检查其程序的文件IO,并检查那些解决方案,包括其他一些答案,都在做同样的事情文件删除操作。
还可以在不删除文件内容的情况下真正丢弃文件内容,但这需要明确打开现有文件并明确丢弃其内容。修改另一个答案以避免删除,这将是
procedure DeleteThisFileContent(const FileToClear: TFileName);
var
F: File;
begin
FileMode := 2;
AssignFile(F, FileToClear );
ReSet(F, 1);
Truncate(F);
CloseFile(F);
end;
基于旧的Pascal函数
然后可能进入并发文件访问问题 - 当监视器前面的人仍然打开该文本文件时,提到错误。
首先,如果此人在记事本中读取文件,这并不意味着文件 IS OPEN - 这几乎不意味着文件已打开,已阅读和已关闭 。但是,如果此人在Microsoft Word中读取文件,那么该文件可能现在正在打开。由于Windows在文件及其名称之间没有什么区别,因此在最后一种情况下,使用普通的OS方法无法删除文件。
但这不是关于 FILE SHARING 的全部内容。事实是,当一些程序打开文件时,它还指定了对文件共享约束的需求。即使程序员没有明确要求它,它也应该使用一些默认值来声明它对OS的意图。可以用Delphi RTL源检查它。如果我们考虑上述情况,当另一个用户在MS Word中打开文件时,默认情况下该文件将在 fmShareDenyWrite中打开 - 其他应用程序可以打开文件进行读取但不能写入。模式。
这意味着在读取+写入模式(对ReSet
的调用)中打开文件的尝试将失败,这将是文件系统级别的访问冲突。如果topicstarter尝试ReSet
读取+从CD-ROM或某些只读网络共享中写入文件,则会发生同样的情况。因为topicstarter仍然可以更改FileMode
并执行文件的只读ReSet
。但是......然而,文件将以只读模式打开,这意味着删除文件内容(调用Truncate
)将不再可能。
那么,如果一些异国情调的查看器应用程序打开文件会发生什么,会将其读取到第1234行(并且有#34;光标"那里)然后突然我们的程序切断了所有内容并使文件只包含12个短行?然后突然查看器将在文件中有一个无效的位置,如果没有某种错误恢复路径,将无法再读取它,这将重新打开文件或至少从头开始重新读取它。但是,如果Viewer的开发人员没有编写这个特定的错误恢复代码,那么Viewer就会崩溃。
总而言之,主题启动者应该考虑他对并发文件访问(共享)的方法: