我只是想从指定的文本文件中删除前N个字符,但我被卡住了。请帮帮我!
procedure HeadCrop(const AFileName: string; const AHowMuch: Integer);
var
F: TextFile;
begin
AssignFile(F, AFileName);
// what me to do next?
// ...
// if AHowMuch = 3 and file contains"Hello!" after all statements
// it must contain "lo!"
// ...
CloseFile(F);
end;
我试图使用TStringList,但它还附加了行尾字符!
with TStringList.Create do
try
LoadFormFile(AFileName); // before - "Hello!"
// even there are no changes...
SaveToFile(AFileName); // after - "Hello!#13#10"
finally
Free;
end;
谢谢!
答案 0 :(得分:9)
从Windows中的文件开头删除内容没有简单的方法。您必须将文件复制到另一个文件,删除原始文件并重命名目标文件,或者将文件中的所有数据复制回几个字节,然后截断文件。如果文件很小并且可以加载到内存中,后一种方法就变得非常简单了。
以下代码片段使用全尺寸内存缓冲区实现后一种方法。
var
fs: TFileStream;
ms: TMemoryStream;
begin
fs := TFileStream.Create('somefile', fmOpenReadWrite); // catch errors here!
try
ms := TMemoryStream.Create;
try
ms.CopyFrom(fs, 0);
ms.Position := 42; // head bytes to skip
fs.Position := 0;
fs.CopyFrom(ms, ms.Size - ms.Position);
fs.Size := fs.Position;
finally FreeAndNil(ms); end;
finally FreeAndNil(fs); end;
end;
答案 1 :(得分:2)
Gabr打败了我,但我采取了另一种方法:
procedure HeadCrop(const AFileName: string; const AHowMuch: Int64);
var
lFileStream: TFileStream;
lPos: Int64;
lRead: Integer;
lBuffer: array[0..511] of Byte;
begin
lFileStream := TFileStream.Create(AFileName, fmOpenReadWrite);
try
if lFileStream.Size < AHowMuch then
begin
lFileStream.Size := 0;
Exit;
end;
lPos := AHowMuch;
repeat
lFileStream.Position := lPos;
lRead := lFileStream.Read(lBuffer, SizeOf(lBuffer));
lFileStream.Position := lPos - AHowMuch;
lFileStream.Write(lBuffer, lRead);
Inc(lPos, SizeOf(lBuffer));
until lRead <> SizeOf(lBuffer);
lFileStream.Size := lFileStream.Size - AHowMuch;
finally
lFileStream.Free;
end;
end;
此代码读取文件并在文件中移回512字节的块。
PS:这个程序只移动字节,而不是字符!所以这只适用于一个字节的字符。