用delphi删除文本文件中的所有行

时间:2013-07-26 02:38:06

标签: delphi

如果我已经创建了文本文件,那么我需要删除文本文件中的所有行以获取新的新文本。我们怎么做?当然,不首先删除文本文件然后创建新文本文件,只需删除文本文件内容然后添加新的行文本。当显示器前面的人仍然打开该文本文件时,避免错误。

我使用的是TextFile类型,而不是TFileStream。附加,重写和关闭文件功能以打开文件。

就像

一样
DeleteThisTextFileContent(ExtractFilePath(Application.Exename)+'log.txt');

谢谢!

2 个答案:

答案 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就会崩溃。

总而言之,主题启动者应该考虑他对并发文件访问(共享)的方法:

  • 要么忽略它,要么希望用户用来读取文件的程序,很久以前就关闭了该文件。然后,他可以自由删除该文件并重新创建它,因为另一个答案建议(或使用上面的oneliner之一)。如果无法删除或重新创建文件,这需要提前考虑并编写一些计划如何处理。
  • 或尝试将文件长度实际设置为零,并让任何其他程序,用户用来读取文件,从此恢复或崩溃并死亡。然而,这也需要"不允许"代码路径。
  • 或者可以实施"循环赛#34;当程序保存N个最后日志文件并始终记录到新日志时,然后尝试不时地删除太旧的日志。这样,如果删除失败,就可以记录并忽略它。它不会阻止应用程序登录到新文件,并且只会在一天或一周后再次尝试删除已锁定的过期日志。