如何在Delphi中为保存的文件增加数量?

时间:2009-03-17 02:56:42

标签: delphi save numbers

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

任何人都可以告诉我如何保存它,这个数字会比最后一个高吗?例如:Save 1:Screenshot0001.bmp Save 2:Screenshot0002.bmp 保存3:截图0003.bmp

等等。

3 个答案:

答案 0 :(得分:14)

有很多方法可以实现这样的目标。

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

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

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

  4. ...

    i := 0;
    while FileExists(Format('%sScreenshot%.04d.bmp',[ImgPath,i])) do
      inc(i);
    

答案 1 :(得分:2)

在程序启动时,迭代所有Screenshot * .bmp文件,解析数字部分并找到最高 - 将此值分配给您的计数器。在进行快照时,进入一个循环,尝试使用“仅创建,如果不存在”(CREATE_NEW)语义来破坏Screenshot.bmp,递增计数器直到找到未使用的名称。

或者,使用timestamp而不是counter:)

答案 2 :(得分:0)

您需要这样的例程来模仿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;