Ich muss eine eindeutige temporäre Datei mit der Erweiterung .csv generieren.
Was ich gerade mache, ist
string filename = System.IO.Path.GetTempFileName().Replace(".tmp", ".csv");
Dies garantiert jedoch nicht, dass meine CSV-Datei eindeutig ist.
Ich weiß, dass die Wahrscheinlichkeit, dass ich jemals eine Kollision habe, sehr gering ist (insbesondere wenn Sie bedenken, dass ich die .tmp-Dateien nicht lösche), aber dieser Code sieht für mich nicht gut aus.
Natürlich könnte ich manuell zufällige Dateinamen generieren, bis ich schließlich einen eindeutigen finde (was kein Problem sein sollte), aber ich bin gespannt, ob andere einen guten Weg gefunden haben, um mit diesem Problem umzugehen.
c#
.net
temporary-files
Brann
quelle
quelle
GetTempFileName()
erstellt wird . - Wenn Sie die Zeichenfolge sofort in eine andere ändern, haben Sie gerade eine neue Null-Byte-Datei in Ihrem temporären Verzeichnis erstellt (und wie andere angemerkt haben, schlägt dies möglicherweise fehl, wenn Sie dort 65535-Dateien aufrufen ...) - - Um dies zu vermeiden, löschen Sie alle Dateien, die Sie in diesem Ordner erstellen (einschließlich der von, die von zurückgegeben werdenGetTempFileName()
, idealerweise in einem finally-Block).Antworten:
Garantiert (statistisch) eindeutig:
(Um aus dem Wiki-Artikel über die Wahrscheinlichkeit einer Kollision zu zitieren:
EDIT: Bitte beachten Sie auch die Kommentare von JaredPar.
quelle
Probieren Sie diese Funktion aus ...
Es wird ein vollständiger Pfad mit der Erweiterung Ihrer Wahl zurückgegeben.
Es ist nicht garantiert, dass ein eindeutiger Dateiname erstellt wird, da diese Datei möglicherweise bereits von einer anderen Person erstellt wurde. Die Wahrscheinlichkeit, dass jemand die nächste von Ihrer App erstellte Anleitung errät und erstellt, ist jedoch sehr gering. Es ist ziemlich sicher anzunehmen, dass dies einzigartig sein wird.
quelle
Guid.NewGuid().ToString() + extension
ist nicht einmal richtig, sollte es seinGuid.NewGuid().ToString() + "." + extension
.txt
oder nichttxt
), aber daChangeExtension
beide Fälle behandelt werden, kann es nicht schadenHinweis: Dies funktioniert wie Path.GetTempFileName. Eine leere Datei wird erstellt, um den Dateinamen zu reservieren. Bei Kollisionen, die von Path.GetRandomFileName () generiert werden, werden 10 Versuche ausgeführt.
quelle
Path.GetRandomFileName()
tatsächlich eine Null-Byte-Datei auf der Festplatte erstellt wird und der vollständige Pfad dieser Datei zurückgegeben wird. Sie verwenden diese Datei nicht, sondern nur ihren Namen, um die Erweiterung zu ändern. Wenn Sie also nicht sicherstellen, dass Sie diese temporären Dateien löschen, schlägt sie nach 65535-Aufrufen dieser Funktion fehl.GetTempFileName()
undGetRandomFileName()
.GetTempFileName()
Erstellen Sie eine Null-Byte-Datei wie meine Methode,GetRandomFileName()
erstellen Sie jedoch keine Datei. Aus den Dokumenten:> Im Gegensatz zu GetTempFileName erstellt GetRandomFileName keine Datei. Ihr Link verweist auf die falsche Seite.Alternativ können Sie auch System.CodeDom.Compiler.TempFileCollection verwenden .
Hier habe ich eine txt-Erweiterung verwendet, aber Sie können angeben, was Sie wollen. Ich habe auch das Keep-Flag auf true gesetzt, damit die temporäre Datei nach der Verwendung erhalten bleibt. Leider erstellt TempFileCollection eine zufällige Datei pro Erweiterung. Wenn Sie mehr temporäre Dateien benötigen, können Sie mehrere Instanzen von TempFileCollection erstellen.
quelle
Warum nicht prüfen, ob die Datei existiert?
quelle
In der MSDN-Dokumentation zu GetTempFileName von C ++ wird Ihr Anliegen erläutert und beantwortet:
quelle
Wie wäre es mit:
Es ist höchst unwahrscheinlich, dass der Computer zum gleichen Zeitpunkt dieselbe Guid generiert. Die einzige Schwäche, die ich hier sehe, ist die Auswirkung auf die Leistung, die DateTime.Now.Ticks hinzufügen wird.
quelle
Sie können auch Folgendes tun
und das funktioniert auch wie erwartet
quelle
Meiner Meinung nach werden die meisten Antworten hier als nicht optimal vorgeschlagen. Derjenige, der am nächsten kommt, ist der ursprüngliche, der ursprünglich von Brann vorgeschlagen wurde.
Ein temporärer Dateiname muss sein
Aufgrund dieser Anforderungen ist es keine gute Idee, ein solches Tier selbst zu programmieren. Intelligente Leute, die E / A-Bibliotheken schreiben, sorgen sich um Dinge wie Sperren (falls erforderlich) usw. Daher sehe ich keine Notwendigkeit, System.IO.Path.GetTempFileName () neu zu schreiben.
Dies sollte, auch wenn es ungeschickt aussieht, den Job machen:
quelle
File.Move
wird ausgelöst,IOException
wenn die Zieldatei bereits vorhanden ist. msdn.microsoft.com/en-us/library/…Dies könnte für Sie nützlich sein ... Es ist eine temporäre zu erstellen. Ordner und geben Sie es als Zeichenfolge in VB.NET zurück.
Einfach in C # umwandelbar:
quelle
Dies scheint für mich in Ordnung zu sein: Es prüft, ob Dateien vorhanden sind, und erstellt die Datei, um sicherzustellen, dass es sich um einen beschreibbaren Speicherort handelt. Sollte dies gut funktionieren, können Sie es ändern, um direkt den FileStream zurückzugeben (was normalerweise für eine temporäre Datei erforderlich ist):
quelle
Einfache Funktion in C #:
quelle
Ich habe die Antworten @Maxence und @Mitch Wheat gemischt, wobei ich die Semantik der GetTempFileName-Methode (der Dateiname ist der Name einer neu erstellten Datei) verwenden möchte, wobei die bevorzugte Erweiterung hinzugefügt wird.
quelle
Das mache ich:
quelle
Dies ist eine einfache, aber effektive Methode, um inkrementelle Dateinamen zu generieren. Es wird direkt in der aktuellen Version angezeigt (Sie können dies leicht auf eine andere Stelle verweisen) und nach Dateien mit der Basis YourApplicationName * .txt suchen (auch dies können Sie problemlos ändern). Es beginnt um 0000, sodass der erste Dateiname YourApplicationName0000.txt lautet. Wenn sich aus irgendeinem Grund Dateinamen mit Junk zwischen dem linken und dem rechten Teil befinden (dh keine Zahlen), werden diese Dateien aufgrund des Tryparse-Aufrufs ignoriert.
quelle
Aufgrund der Antworten, die ich aus dem Internet gefunden habe, komme ich wie folgt zu meinem Code:
Und als C # -Kochbuch von Jay Hilyard wies Stephen Teilhet auf die Verwendung einer temporären Datei in Ihrer Anwendung hin :
Sie sollten eine temporäre Datei verwenden, wenn Sie Informationen vorübergehend speichern müssen, um sie später abzurufen.
Das einzige, woran Sie denken müssen, ist, diese temporäre Datei zu löschen, bevor die Anwendung, die sie erstellt hat, beendet wird.
Wenn es nicht gelöscht wird, bleibt es im temporären Verzeichnis des Benutzers, bis der Benutzer es manuell löscht.
quelle
Ich denke, Sie sollten dies versuchen:
Es generiert einen eindeutigen Dateinamen und erstellt eine Datei mit diesem Dateinamen an einem bestimmten Speicherort.
quelle