首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何快速清零文件的内容?

如何快速清零文件的内容?
EN

Stack Overflow用户
提问于 2011-04-22 23:10:27
回答 5查看 2.4K关注 0票数 6

我想终止用户从我的程序中选择的文件。我写了这个示例代码:

代码语言:javascript
运行
复制
var
  aFile: TFileStream;
Const
  FileAddr: String = 'H:\Akon.mp3';
  Buf: Byte = 0;
begin
  if FileExists(FileAddr) then
  begin
    // Open given file in file stream & rewrite it
    aFile:= TFileStream.Create(FileAddr, fmOpenReadWrite);
    try
      aFile.Seek(0, soFromBeginning);
      while aFile.Position <> aFile.Size do
        aFile.Write(Buf, 1);
    finally
      aFile.Free;
      ShowMessage('Finish');
    end;
  end;
end;

如你所见,我用0 (null)值覆盖了给定的文件。这段代码运行正常,但在大文件中速度非常慢。我想在多线程代码中执行此过程,但我尝试了一些代码,但无法完成。例如,我创建了4个线程来完成这项工作,以加快这一过程。

有什么方法可以加速这个过程吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-22 23:17:14

我不知道它是否可以帮助你,但我认为你可以做得更好(比多线程)写一个更大的缓冲区的文件。

例如,您可以初始化一个16k宽的缓冲区并直接写入FileStream;您只需检查文件的最后一部分,您只需写入整个缓冲区的一部分。

相信我,它真的会更快...

票数 4
EN

Stack Overflow用户

发布于 2011-04-22 23:44:35

好吧,我会咬人的:

代码语言:javascript
运行
复制
const
  FileAddr: String = 'H:\Akon.mp3';
var
  aFile: TFileStream;
  Buf: array[0..1023] of Byte;
  Remaining, NumBytes: Integer;
begin
  if FileExists(FileAddr) then
  begin
    // Open given file in file stream & rewrite it
    aFile:= TFileStream.Create(FileAddr, fmOpenReadWrite);
    try
      FillChar(Buf, SizeOf(Buf), 0);
      Remaining := aFile.Size;
      while Remaining > 0 do begin
        NumBytes := SizeOf(Buf);
        if NumBytes < Remaining then
          NumBytes := Remaining;      
        aFile.WriteBuffer(Buf, NumBytes);
        Dec(Remaining, NumBytes);
      end;
    finally
      aFile.Free;
      ShowMessage('Finish');
    end;
  end;
end;
票数 4
EN

Stack Overflow用户

发布于 2011-04-22 23:27:28

多线程在这里帮不了你。您的限制是磁盘访问,这主要是因为您一次只写入一个字节。

Buf声明为字节数组,并使用FillCharZeroMemory对其进行初始化。然后更改while循环,如下所示:

代码语言:javascript
运行
复制
while ((aFile.Position + SizeOf(Buf)) < aFile.Size) do
begin
  aFile.Write(Buf, SizeOf(Buf));
end;
if (aFile.Position < aFile.Size) then
begin
  aFile.Write(Buf, aFile.Size - aFile.Position);
end;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5756787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档