如何在 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 中添加越来越多的已保存文件?的主要内容,如果未能解决你的问题,请参考以下文章

在Delphi中处理word文档与数据库的互联

在Delphi中处理word文档与数据库的互联 1

1,Delphi 生成的EXE 文件输出在哪个目录?如何改变?

如何在Delphi中将诸如TMemo等文本控件的内容保存为TXT文件?

如何通过delphi保存对话框一次保存多个文件

已有一个delphi程序但没有用户登录界面,如何添加登录Form