如何在 Delphi 中添加越来越多的已保存文件?
Posted
技术标签:
【中文标题】如何在 Delphi 中添加越来越多的已保存文件?【英文标题】:How to add increasing number to saved files in Delphi? 【发布时间】:2009-03-17 02:56:41 【问题描述】:我正在制作一个程序来拍摄屏幕快照,并将其作为位图图片保存到文件夹中。不过我似乎遇到了问题,图片只是覆盖了自己。
谁能告诉我怎么做,这样当它保存时,数字会比上一个高一个?例如: 保存 1:Screenshot0001.bmp 保存 2:Screenshot0002.bmp 保存3:截图0003.bmp
等等。
【问题讨论】:
【参考方案1】:有很多方法可以完成这样的事情。
像你的数码相机那样做;有一个计数器并将其保存在文件或注册表中。您可能会遇到多用户问题,并且您仍然需要处理图像已经存在的情况。
不要使用递增数字,而是在文件名中写入日期时间。 FileName := 'Screenshot_'+FormatDateTime('yyyymmdd-hhnnss-zzz.bmp',now());
执行下面的代码来查找最新号码。我认为这符合您的描述,但请记住,当您编写更多图像时,此代码会变慢。由于有数千张图片和缓慢的驱动器或网络,它可能会“挂起”您的程序。
..
i := 0;
while FileExists(Format('%sScreenshot%.04d.bmp',[ImgPath,i])) do
inc(i);
【讨论】:
我遇到了问题。我添加了 FileName := +FormatDateTime('yyyymmdd-hhnnss-zzz.bmp',now());并将 [FileName] 添加到以下代码: bmp.SaveToFile('C:\Screenshots\ScreenShot[FileName].bmp');但我不知道我是否做得对。 FileName:= 表示它未声明。 你需要声明你的变量,凯文。检查有关的帮助。另请查看有关字符串连接的帮助。 我将 FileName 变量声明为 FileName: string;,我将 FileName := 和 SaveTo 行重写为: FileName := 'Screenshot_'+FormatDateTime('yyyymmdd-hhnnss-zzz',now ()); bmp.SaveToFile('C:\Screenshots[FileName].bmp');,现在,当它制作并保存位图时,它会以 [FileName].bmp 的形式出现。 @PuppyKevin:试试“bmp.SaveToFile('C:\Screenshots\' + FileName + '.bmp');”相反,或使用另一个 Format() 调用:"bmp.SaveToFile(Format('C:\Screenshots\%s.bmp', [FileName]));" mghie,我使用了你的 Format() 方式,它成功了!谢谢大家帮助我:)【参考方案2】:在程序启动时,迭代所有 Screenshot*.bmp 文件,解析出数字部分并找到最高的 - 将此值分配给您的计数器。进行快照时,进入一个循环,尝试使用“仅在不存在时创建”(CREATE_NEW)语义创建 Screenshot.bmp,递增计数器直到找到未使用的名称。
或者,使用时间戳而不是计数器 :)
【讨论】:
+1 提示以原子方式执行此操作(多用户友好)。但考虑到 OP 的经验水平,其他答案似乎更合适。【参考方案3】:您需要一个类似 Windows 文件复制的例程,其中第一个文件是“我的文件”,第二个是“我的文件 (2)”,然后是“我的文件 (3)”等。
function AppendDuplicationNumber( const AStr : string ) : string;
// Used to make strings unique
// This examines the string AStr for trailing '(n)' where
// 'n' is an integer.
// If the (n) part is found, n is incremented, otherwise '(2)' is
// appended to the string.
var
iLH, iRH, I : integer;
S : string;
begin
Result := AStr;
iLH := CharPosBackwards( '(', Result );
If iLH > 0 then
begin
iRH := PosEx( ')', Result, iLH );
If iRH > 0 then
begin
I := StrToIntDef( Copy( Result, iLH+1, iRH-iLH-1 ), 0 );
If I > 0 then
begin
Inc(I);
S := IntToStr( I );
Delete( Result, iLH+1, iRH-iLH-1 );
Insert( S, Result, iLH+1 );
Exit;
end;
end;
end;
// Did not increment existing (n), so append it.
Result := Result + ' (2)';
end;
【讨论】:
这显然不是 OP 想要的,他特别想要文件名,其中一部分是增加的数字。以上是关于如何在 Delphi 中添加越来越多的已保存文件?的主要内容,如果未能解决你的问题,请参考以下文章
1,Delphi 生成的EXE 文件输出在哪个目录?如何改变?