J'ai besoin de générer un fichier temporaire unique avec une extension .csv.
Ce que je fais en ce moment c'est
string filename = System.IO.Path.GetTempFileName().Replace(".tmp", ".csv");
Cependant, cela ne garantit pas que mon fichier .csv sera unique.
Je sais que les chances d'avoir une collision sont très faibles (surtout si vous considérez que je ne supprime pas les fichiers .tmp), mais ce code ne me semble pas bon.
Bien sûr, je pouvais générer manuellement des noms de fichiers aléatoires jusqu'à ce que j'en trouve finalement un unique (ce qui ne devrait pas être un problème), mais je suis curieux de savoir si d'autres ont trouvé une bonne façon de résoudre ce problème.
c#
.net
temporary-files
Brann
la source
la source
GetTempFileName()
crée un nouveau fichier chaque fois que vous l'appelez. - Si vous changez immédiatement la chaîne en quelque chose d'autre, vous venez de créer un nouveau fichier zéro octet dans votre répertoire temporaire (et comme d'autres l'ont remarqué, cela finira par entraîner son échec lorsque vous frapperez 65535 fichiers là-dedans ...) - - Pour éviter cela, assurez-vous de supprimer tous les fichiers que vous créez dans ce dossier (y compris ceux renvoyés parGetTempFileName()
, idéalement dans un bloc enfin).Réponses:
Garanti (statistiquement) unique:
(Pour citer un article du wiki sur la probabilité d'une collision:
EDIT: Veuillez également consulter les commentaires de JaredPar.
la source
Essayez cette fonction ...
Il renverra un chemin complet avec l'extension de votre choix.
Remarque, il n'est pas garanti de produire un nom de fichier unique car quelqu'un d'autre aurait pu techniquement déjà créé ce fichier. Cependant, les chances que quelqu'un devine le prochain guide produit par votre application et le crée sont très très faibles. Il est assez sûr de supposer que ce sera unique.
la source
Guid.NewGuid().ToString() + extension
n'est même pas correct, il devrait l'êtreGuid.NewGuid().ToString() + "." + extension
.txt
ou nontxt
) mais comme ilChangeExtension
gère les deux cas, cela ne peut pas faire de malRemarque: cela fonctionne comme Path.GetTempFileName. Un fichier vide est créé pour réserver le nom du fichier. Il fait 10 tentatives, en cas de collisions générées par Path.GetRandomFileName ();
la source
Path.GetRandomFileName()
crée en fait un fichier de zéro octet sur le disque et renvoie le chemin complet de ce fichier. Vous n'utilisez pas ce fichier, seulement son nom pour changer l'extension. Donc, si vous ne vous assurez pas de supprimer ces fichiers temporaires, après 65535 appels à cette fonction, il commencera à échouer.GetTempFileName()
etGetRandomFileName()
.GetTempFileName()
créer un fichier zéro octet comme ma méthode, maisGetRandomFileName()
ne crée pas de fichier. À partir des documents:> Contrairement à GetTempFileName, GetRandomFileName ne crée pas de fichier. Votre lien pointe vers la mauvaise page.Vous pouvez également utiliser System.CodeDom.Compiler.TempFileCollection .
Ici, j'ai utilisé une extension txt mais vous pouvez spécifier ce que vous voulez. J'ai également défini l'indicateur keep sur true afin que le fichier temporaire soit conservé après utilisation. Malheureusement, TempFileCollection crée un fichier aléatoire par extension. Si vous avez besoin de plus de fichiers temporaires, vous pouvez créer plusieurs instances de TempFileCollection.
la source
Pourquoi ne pas vérifier si le fichier existe?
la source
La documentation MSDN pour GetTempFileName de C ++ explique votre problème et y répond:
la source
Que diriez-vous:
Il est hautement improbable que l'ordinateur génère le même Guid au même instant. La seule faiblesse que je vois ici est l'impact sur les performances que DateTime.Now.Ticks ajoutera.
la source
Vous pouvez également effectuer les opérations suivantes
et cela fonctionne aussi comme prévu
la source
À mon avis, la plupart des réponses proposées ici ne sont pas optimales. Celui qui s'en rapproche le plus est celui proposé initialement par Brann.
Un nom de fichier temporaire doit être
En raison de ces exigences, ce n'est pas une mauvaise idée de programmer une telle bête par vous-même. Les personnes intelligentes écrivant des bibliothèques d'E / S s'inquiètent de choses comme le verrouillage (si nécessaire), etc. Par conséquent, je ne vois pas la nécessité de réécrire System.IO.Path.GetTempFileName ().
Cela, même s'il semble maladroit, devrait faire l'affaire:
la source
File.Move
augmenteIOException
si le fichier de destination existe déjà. msdn.microsoft.com/en-us/library/…Cela pourrait être pratique pour vous ... C'est pour créer un temp. dossier et le renvoyer sous forme de chaîne dans VB.NET.
Facilement convertible en C #:
la source
Cela semble bien fonctionner pour moi: il vérifie l'existence du fichier et crée le fichier pour être sûr qu'il s'agit d'un emplacement accessible en écriture. Devrait fonctionner correctement, vous pouvez le changer pour retourner directement le FileStream (qui est normalement ce dont vous avez besoin pour un fichier temporaire):
la source
Fonction facile en C #:
la source
Sur la base des réponses que j'ai trouvées sur Internet, j'arrive à mon code comme suit:
Et comme le livre de recettes C # par Jay Hilyard, Stephen Teilhet a souligné dans Utilisation d'un fichier temporaire dans votre application :
vous devez utiliser un fichier temporaire chaque fois que vous avez besoin de stocker des informations temporairement pour une récupération ultérieure.
La seule chose dont vous devez vous souvenir est de supprimer ce fichier temporaire avant la fermeture de l'application qui l'a créé.
S'il n'est pas supprimé, il restera dans le répertoire temporaire de l'utilisateur jusqu'à ce que l'utilisateur le supprime manuellement.
la source
J'ai mélangé les réponses @Maxence et @Mitch Wheat en gardant à l'esprit que je veux la sémantique de la méthode GetTempFileName (le fileName est le nom d'un nouveau fichier créé) en ajoutant l'extension préférée.
la source
Voici ce que je fais:
la source
Il s'agit d'un moyen simple mais efficace de générer des noms de fichiers incrémentiels. Il cherchera directement dans le courant (vous pouvez facilement le signaler ailleurs) et recherchera des fichiers avec la base YourApplicationName * .txt (encore une fois, vous pouvez facilement changer cela). Il commencera à 0000 afin que le premier nom de fichier soit YourApplicationName0000.txt. si pour une raison quelconque, il y a des noms de fichiers avec des ordures entre (ce qui ne signifie pas des nombres) les parties gauche et droite, ces fichiers seront ignorés en raison de l'appel tryparse.
la source
Je pense que vous devriez essayer ceci:
Il génère un nom de fichier unique et crée un fichier avec ce nom de fichier à un emplacement spécifié.
la source