Как добавить увеличивающееся число сохраненных файлов в Delphi?
Вопрос
Я создаю программу, которая делает снимок экрана и сохраняет его в папке в виде растрового изображения.Кажется, у меня возникла проблема: изображение просто перезаписывает себя.
Может ли кто-нибудь сказать мне, как я могу сделать так, чтобы при сохранении число было на единицу больше, чем последнее?Например:Сохранение 1:Screenshot0001.bmp Сохранение 2:Скриншот0002.bmp Save 3:Скриншот0003.bmp
И так далее.
Решение
Есть много способов добиться чего-то подобного.
Делайте это так, как это делает ваша цифровая камера;Имейте счетчик и сохраняйте его в файле или в реестре.Вероятно, вы столкнетесь с проблемами многопользовательской работы и вам все равно придется справляться с ситуациями, когда изображение уже существует.
Не используйте возрастающее число, а напишите дату и время в имени файла.FileName := 'Screenshot_'+FormatDateTime('yyyymmdd-hhnnss-zzz.bmp',now());
Сделайте что-то вроде кода ниже, чтобы найти последний номер.Я думаю, что это делает то, что вы описываете, но помните, что этот код будет работать медленнее, когда вы пишете больше изображений.Из-за тысяч изображений и медленного диска или сети ваша программа может «зависнуть».
..
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;