我尝试在现有的.txt文件中添加一定数量的条目后创建一个新的.txt文件。例如,我希望文件中有50个条目,然后,我希望创建一个新文件,并且这些条目在该新文件中继续存在。假设我不希望日志文件中填充很多行,而是具有更多的.txt文件,其中条目将被划分。
下面是我的示例代码:
procedure TForm1.Button3Click(Sender: TObject);
function CountRows(Afilename: string): integer;
var
f: TextFile;
i: integer;
begin
assignfile(f, afilename);
reset(f);
result := 0;
while not eof(f) do
begin
readln(f);
inc(result);
end;
closefile(f);
end;
var
f: TextFile;
fileName: String;
fs: Tformatsettings;
begin
fs.shortdateformat := 'DD.MM.YYYY';
fs.TimeSeparator := ':';
filename := 'D:\LogLprf\LogLpFr ' + Datetostr(now, fs) + '.txt';
assignfile(f, filename);
if FileExists(filename) then
begin
if CountRows(filename)>=2 then
begin
filename := 'D:\LogLprf\LogLpFr ' + Datetostr(now, fs) +'1.txt';
assignfile(f, filename);
rewrite(f);
end
else
append(f);
end
else
begin
rewrite(f);
end;
fs.ShortDateFormat := 'DD.MM.YYYY HH:mm:ss';
Writeln(f, datetimetostr(now, fs)+'- '+'Some error...');
closefile(f);
end;
使用上面的代码,我设法创建了第一个文件,如果第一个文件中的条目数达到了限制,则创建第二个文件。但是,第二个文件每次都在重新创建。我知道这是因为我调用了rewrite(f)
,但我需要它在前一个文件的条目到达它们的结尾后创建一个新的.txt文件。我也尝试过在CountRows(filename)
之后调用fileexists(filename)
,但这不是一个好的解决方案,因为我将有很多嵌套的if语句,如果我们需要创建很多.txt文件,这将无法解决问题。我也尝试过循环,但这也不能解决问题。欢迎提出任何建议...谢谢
4条答案
按热度按时间c86crjj01#
当你定义文件名时,你使用的是DateToStr,它只会在你的文件名中添加日期信息。因此,如果你试图在一天内多次创建新文件名,你将总是得到相同的文件名,因为
DateToString
每次都会返回相同的结果。如果不使用
DateToString
,你应该使用DateTimeToString,因为这样会在结果中包含时间信息,这样你就可以在同一天创建多个不同的文件名,除非你需要在一秒钟内创建多个新文件名,否则你不会有任何问题。另一种方法是对文件进行递增编号,以便每个文件名的末尾都包含一个唯一的编号。
您可以找到有关如何实现此here的解决方案
或者,如果您需要更友好的文件命名系统,您也可以将您的命名系统与自动递增编号方法相结合。
wixjitnu2#
请看代码,我发现作为一个解决方案,适合我很好...与所有的人的帮助下,评论和张贴到我的问题:
我使用了@Ehab提供的函数
GetFilesCount
,并添加了一个类似的函数SearchFiles
,它将搜索所有文件,并确保最后一个文件是我们正在用于编写的文件。(我最初的问题是,在我的第一个代码中,我总是使用同一个文件...)我感谢所有帮助...5gfr0r5j3#
今天,我有一个破坏Delphi7,所以,这里是一个完整的工作样本。
执行科
vybvopom4#
我现在没有运行环境来测试您的代码,但我认为您可以尝试类似的方法: