【问题标题】:How to add increasing number to saved files in Delphi?如何在 Delphi 中添加越来越多的已保存文件?
【发布时间】:2009-03-17 02:56:41
【问题描述】:

我正在制作一个程序来拍摄屏幕快照,并将其作为位图图片保存到文件夹中。不过我似乎遇到了问题,图片只是覆盖了自己。

谁能告诉我怎么做,这样当它保存时,数字会比上一个高一个?例如: 保存 1:Screenshot0001.bmp 保存 2:Screenshot0002.bmp 保存3:截图0003.bmp

等等。

【问题讨论】:

    标签: delphi save numbers


    【解决方案1】:

    有很多方法可以完成这样的事情。

    1. 像你的数码相机那样做;有一个计数器并将其保存在文件或注册表中。您可能会遇到多用户问题,并且您仍然需要处理图像已经存在的情况。

    2. 不要使用递增数字,而是在文件名中写入日期时间。 FileName := 'Screenshot_'+FormatDateTime('yyyymmdd-hhnnss-zzz.bmp',now());

    3. 执行下面的代码来查找最新号码。我认为这符合您的描述,但请记住,当您编写更多图像时,此代码会变慢。由于有数千张图片和缓慢的驱动器或网络,它可能会“挂起”您的程序。

    ..

    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 想要的,他特别想要文件名,其中一部分是增加的数字。
    最近更新 更多