Как добавить увеличивающееся число сохраненных файлов в Delphi?

StackOverflow https://stackoverflow.com/questions/652886

  •  19-08-2019
  •  | 
  •  

Вопрос

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

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

И так далее.

Это было полезно?

Решение

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

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

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

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

..

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

Другие советы

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

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

Вам нужна такая подпрограмма, которая имитирует дублирование файлов 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top