Como adicionar número crescente de arquivos salvos no Delphi?
Pergunta
Eu estou fazendo um programa que leva um instantâneo da tela, e salva-lo para uma pasta como uma imagem Bitmap. Parece que estou correndo em um problema, porém, a imagem apenas substitui-se.
Alguém pode me dizer como posso fazê-lo assim quando ele salva, o número será um maior do que o último? Por exemplo: Salvar 1: Screenshot0001.bmp Salvar 2: Screenshot0002.bmp Guardar 3: Screenshot0003.bmp
E assim por diante.
Solução
Existem muitas maneiras de conseguir algo parecido com isso.
-
Faça como sua câmera digital faz; Tem um contador e salvá-lo em um arquivo ou no registro. Você provavelmente vai correr em problemas multi-usuário e você ainda vai ter que situações punho, onde uma imagem já existe.
-
Não use um número incremental, mas escrever uma data e hora no nome do arquivo. FileName: = 'tela _' + FormatDateTime ( 'AAAAMMDD-hhnnss-zzz.bmp', agora ());
-
fazer algo como o código abaixo para encontrar o último número. Eu acho que isso faz o que você está descrevendo, mas lembre-se que este código vai ficar mais lento como você escrever mais imagens. Com milhares de fotos e um carro lento ou rede poderia 'pendurar' o seu programa.
..
i := 0;
while FileExists(Format('%sScreenshot%.04d.bmp',[ImgPath,i])) do
inc(i);
Outras dicas
No início do programa, itere todos os arquivos tela * .bmp, analisar a parte numérica e encontrar o mais alto - atribuir esse valor para seu contador. Ao fazer um instantâneo, entrar em um loop que tenta crreating Screenshot.bmp com "apenas criam, se ainda não existir" semântica (CREATE_NEW), incrementando o contador até encontrar um nome não utilizado.
Como alternativa, o uso timestamp em vez de balcão:)
Você precisa de uma rotina como esta que imita a duplicação de arquivos do Windows, onde o primeiro arquivo é 'My File', o segundo é 'My File (2)', então 'My File (3)' etc.
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;