我想终止用户从我的程序中选择的文件。我写了这个示例代码:
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个线程来完成这项工作,以加快这一过程。
有什么方法可以加速这个过程吗?
发布于 2011-04-22 15:17:14
我不知道它是否可以帮助你,但我认为你可以做得更好(比多线程)写一个更大的缓冲区的文件。
例如,您可以初始化一个16k宽的缓冲区并直接写入FileStream;您只需检查文件的最后一部分,您只需写入整个缓冲区的一部分。
相信我,它真的会更快...
发布于 2011-04-22 15:44:35
好吧,我会咬人的:
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;
发布于 2011-04-22 15:27:28
多线程在这里帮不了你。您的限制是磁盘访问,这主要是因为您一次只写入一个字节。
将Buf
声明为字节数组,并使用FillChar
或ZeroMemory
对其进行初始化。然后更改while循环,如下所示:
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;
https://stackoverflow.com/questions/5756787
复制相似问题