Как добавить увеличивающееся количество к сохраненным файлам в Delphi? - PullRequest
0 голосов
/ 17 марта 2009

Я делаю программу, которая делает снимок экрана и сохраняет его в папку в виде растрового изображения. Я, кажется, столкнулся с проблемой, хотя картина просто перезаписывает себя.

Может кто-нибудь сказать мне, как я могу сделать так, чтобы при сохранении число было на единицу больше, чем в прошлом? Например: Сохранить 1: Screenshot0001.bmp Сохранить 2: Screenshot0002.bmp Сохранить 3: Screenshot0003.bmp

и т. Д.

Ответы [ 3 ]

14 голосов
/ 17 марта 2009

Есть много способов сделать что-то подобное.

  1. Делайте так, как делает ваша цифровая камера; Есть счетчик и сохранить его в файл или в реестре. Вероятно, вы столкнетесь с многопользовательскими проблемами, и вам все равно придется решать ситуации, когда изображение уже существует.

  2. Не используйте возрастающее число, а пишите дату и время в имени файла. FileName: = 'Screenshot _' + FormatDateTime ('yyyymmdd-hhnnss-zzz.bmp', now ());

  3. Сделайте что-то вроде кода ниже, чтобы найти последний номер. Я думаю, что это делает то, что вы описываете, но помните, что этот код будет работать медленнее, когда вы будете писать больше изображений. Тысячи картинок и медленный диск или сеть могут «повесить» вашу программу.

..

i := 0;
while FileExists(Format('%sScreenshot%.04d.bmp',[ImgPath,i])) do
  inc(i);
2 голосов
/ 17 марта 2009

При запуске программы выполните итерацию всех файлов Screenshot * .bmp, проанализируйте числовую часть и найдите самое высокое - присвойте это значение вашему счетчику. Делая снимок, войдите в цикл, который пытается создать Screenshot.bmp с семантикой «только создавать, если еще не существует» (CREATE_NEW), увеличивая счетчик, пока не найдете неиспользуемое имя.

Альтернативно, используйте метку времени вместо счетчика:)

0 голосов
/ 17 марта 2009

Вам нужна процедура, подобная этой, которая имитирует дублирование файлов 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;
...