Conflito de nomes de arquivos - numerar sufixo

Tenho um servidor que vai guardar arquivos de vídeo que os usuários vão uploadar. Neste servidor, vou guardar, inicialmente, os vídeos em uma pasta…

Se um usuário fizer upload de um vídeo cujo nome é igual a um dos vídeos já salvos vai ocorrer uma colisão de nomes. Existe uma forma simples (talvez usando expreSSões regulares) de adicionar um contador ao fim do radical repetido?

Por exemplo, um usuário salva um arquivo chamado “teste.mpg”. Um segundo usuário salva um arquivo diferente, mas com o mesmo nome. No servidor ele seria salvo como “teste1.mpg”. Caso houvsse mais uma repetição da situação, “teste2.mpg”…Sempre incrementando em ! o contador…

Imaginei separar o contador do radical do nome e adicionar 1 ao maior valor encontrado, mas não sei se a solução é eficaz e, caso for, não sei implementá-la sem fazer alguma gambiarra :wink:

Ninguém tem idéia de como eu poderia fazer isso?

A melhor solução seria você concatenar a data e o horário ao fim do nome do arquivo.
Assim, independe de você se preocupar com colisoes de nomes.

Exemplo: teste1_20070723_224158.mpg, teste1_20070723_224159.mpg

Só isso já faria reduzir a chance de colisão a praticamante zero. Mas, mesmo assim, ainda poderá.
Imagine que 2 usuários façam o upload do mesmo arquivo, com mesmo nome e na mesma hora e segundo? Neste caso, você poderia pensar em um ID único gerado via BD ou algo do gênero para anexar aos nomes dos arquivos.

Seguindo este raciocínio da hora, você pode utilizar o System.currentTimeMillis() que lhe retornará um valor do tipo long com precisão de milisegundos. A probabilidade de ocorrer dois envios no mesmo milisegundo é praticamente nula. Se ainda assim se sentir inseguro, coloque um try{}catch{} e no catch mande ele tentar gravar novamente, como em um método recursivo. Uma hora ele vai ter que gravar.

gravaArquivo(File file){
   try{
      // tenta gravar o arquivo, caso não consiga lança uma exceção.. throws new Exception()...
   }cath(Exception e){
     gravaArquivo(file);
   }
}

Ou usar um if else no lugar do try catch. A lógica é fazer ele tentar novamente caso ocorra esta megasênica coincidência entre os milisegundos.