Preciso gerar um arquivo temporário exclusivo com uma extensão .csv.
O que eu faço agora é
string filename = System.IO.Path.GetTempFileName().Replace(".tmp", ".csv");
No entanto, isso não garante que meu arquivo .csv seja exclusivo.
Sei que as chances de colisão são muito baixas (especialmente se você considerar que eu não excluo os arquivos .tmp), mas esse código não parece bom para mim.
É claro que eu poderia gerar manualmente nomes de arquivos aleatórios até encontrar um único (o que não deve ser um problema), mas estou curioso para saber se outras pessoas encontraram uma boa maneira de lidar com esse problema.
c#
.net
temporary-files
Brann
fonte
fonte
GetTempFileName()
criar um novo arquivo sempre que você o chamar. - Se você alterar imediatamente a string para outra coisa, você acabou de criar um novo arquivo de zero byte no diretório temporário (e como outros observaram, isso acabará causando uma falha ao atingir 65535 arquivos lá ...) - - Para evitar isso, exclua todos os arquivos criados nessa pasta (incluindo os retornados porGetTempFileName()
, idealmente em um bloco final).Respostas:
Garantido para ser (estatisticamente) único:
(Para citar o artigo da wiki sobre a probabilidade de uma colisão:
EDIT: Por favor, veja também os comentários de JaredPar.
fonte
Tente esta função ...
Ele retornará um caminho completo com a extensão de sua escolha.
Observe que não é garantido que você produza um nome de arquivo exclusivo, pois outra pessoa já pode ter criado esse arquivo tecnicamente. No entanto, as chances de alguém adivinhar o próximo guia produzido pelo seu aplicativo e criá-lo são muito muito baixas. É bastante seguro assumir que isso será único.
fonte
Guid.NewGuid().ToString() + extension
não é nem correto, deveria ser #Guid.NewGuid().ToString() + "." + extension
.txt
outxt
) mas desdeChangeExtension
alças ambos os casos, não pode ferirNota: isso funciona como Path.GetTempFileName. Um arquivo vazio é criado para reservar o nome do arquivo. Faz 10 tentativas, no caso de colisões geradas por Path.GetRandomFileName ();
fonte
Path.GetRandomFileName()
na verdade, cria um arquivo de zero byte no disco e retorna o caminho completo desse arquivo. Você não está usando este arquivo, apenas seu nome para alterar a extensão. Portanto, se você não tiver certeza de que está excluindo esses arquivos temporários, após 65535 chamar esta função, ela começará a falhar.GetTempFileName()
eGetRandomFileName()
.GetTempFileName()
crie um arquivo de zero byte como meu método, masGetRandomFileName()
não cria um arquivo. Na documentação:> Diferentemente de GetTempFileName, GetRandomFileName não cria um arquivo. Seu link aponta para a página errada.Como alternativa, você também pode usar System.CodeDom.Compiler.TempFileCollection .
Aqui eu usei uma extensão txt, mas você pode especificar o que quiser. Também defino o sinalizador keep como true para que o arquivo temporário seja mantido após o uso. Infelizmente, TempFileCollection cria um arquivo aleatório por extensão. Se você precisar de mais arquivos temporários, poderá criar várias instâncias do TempFileCollection.
fonte
Por que não verificar se o arquivo existe?
fonte
A documentação do MSDN para GetTempFileName do C ++ discute sua preocupação e a responde:
fonte
E se:
É altamente improvável que o computador gere o mesmo Guid no mesmo instante de tempo. A única fraqueza que vejo aqui é o impacto no desempenho que o DateTime.Now.Ticks adicionará.
fonte
Você também pode fazer o seguinte
e isso também funciona como esperado
fonte
Na minha opinião, a maioria das respostas propostas aqui é subótima. O que mais se aproxima é o original proposto inicialmente por Brann.
Um nome de arquivo temporário deve ser
Devido a esses requisitos, não é uma boa idéia programar um animal desses por conta própria. Pessoas inteligentes que escrevem bibliotecas de E / S se preocupam com coisas como bloqueio (se necessário) etc. Portanto, não vejo necessidade de reescrever System.IO.Path.GetTempFileName ().
Isso, mesmo que pareça desajeitado, deve fazer o trabalho:
fonte
File.Move
aumentaIOException
se o arquivo de destino já existir. msdn.microsoft.com/pt-br/library/…Isso pode ser útil para você ... É criar uma temperatura. pasta e retorne-a como uma string no VB.NET.
Facilmente conversível em C #:
fonte
Isso parece funcionar bem para mim: verifica a existência do arquivo e cria o arquivo para garantir que seja um local gravável. Deve funcionar bem, você pode alterá-lo para retornar diretamente o FileStream (que normalmente é o que você precisa para um arquivo temporário):
fonte
Função Fácil em C #:
fonte
Com base nas respostas que encontrei na internet, chego ao meu código da seguinte maneira:
E, como livro de receitas do C # de Jay Hilyard, Stephen Teilhet apontou em Usando um arquivo temporário no seu aplicativo :
você deve usar um arquivo temporário sempre que precisar armazenar informações temporariamente para recuperação posterior.
A única coisa que você deve se lembrar é excluir esse arquivo temporário antes que o aplicativo que o criou seja finalizado.
Se não for excluído, ele permanecerá no diretório temporário do usuário até que o usuário o exclua manualmente.
fonte
Eu misturei @Maxence e @ Mitch Trigo respostas tendo em mente Eu quero a semântica do método GetTempFileName (o nome do arquivo é o nome de um novo arquivo criado) adicionando a extensão preferido.
fonte
Isto é o que estou fazendo:
fonte
Essa é uma maneira simples, mas eficaz, de gerar nomes de arquivos incrementais. Ele procurará a corrente diretamente (você pode facilmente apontar isso para outro lugar) e procurará por arquivos com o YourApplicationName * .txt básico (novamente, você pode alterar isso facilmente). Ele começará às 0000, para que o primeiro nome do arquivo seja YourApplicationName0000.txt. se, por algum motivo, houver nomes de arquivos com lixo eletrônico (significando não números) as partes esquerda e direita, esses arquivos serão ignorados em virtude da chamada tryparse.
fonte
Eu acho que você deveria tentar o seguinte:
Ele gera um nome de arquivo exclusivo e cria um arquivo com esse nome em um local especificado.
fonte