Muszę wygenerować unikalny plik tymczasowy z rozszerzeniem .csv.
To, co teraz robię, to
string filename = System.IO.Path.GetTempFileName().Replace(".tmp", ".csv");
Nie gwarantuje to jednak, że mój plik .csv będzie unikalny.
Wiem, że szanse na kolizję są bardzo niskie (zwłaszcza jeśli uważasz, że nie usuwam plików .tmp), ale ten kod nie wygląda mi dobrze.
Oczywiście mogłem ręcznie generować losowe nazwy plików, aż w końcu znajdę unikalną (co nie powinno być problemem), ale jestem ciekawy, czy inni znaleźli dobry sposób na poradzenie sobie z tym problemem.
c#
.net
temporary-files
Brann
źródło
źródło
GetTempFileName()
tworzy nowy plik za każdym razem, gdy go wywołujesz. - Jeśli natychmiast zmienisz ciąg znaków na coś innego, właśnie utworzyłeś nowy plik zero-bajtowy w swoim katalogu tymczasowym (i jak zauważyli inni, ostatecznie spowoduje to awarię, gdy trafisz tam 65535 plików ...) - - Aby tego uniknąć, usuń wszystkie pliki, które utworzysz w tym folderze (w tym te zwrócone przezGetTempFileName()
, najlepiej w końcu).Odpowiedzi:
Gwarantujemy (statystycznie) unikalność:
(Cytat z artykułu wiki na temat prawdopodobieństwa kolizji:
EDYCJA: Zobacz także komentarze JaredPara.
źródło
Wypróbuj tę funkcję ...
Zwróci pełną ścieżkę z wybranym rozszerzeniem.
Uwaga: nie ma gwarancji utworzenia unikalnej nazwy pliku, ponieważ ktoś inny mógł już technicznie utworzyć ten plik. Jednak szanse, że ktoś zgadnie kolejny przewodnik utworzony przez twoją aplikację i stworzy go, są bardzo niskie. Można założyć, że będzie to wyjątkowe.
źródło
Guid.NewGuid().ToString() + extension
to nawet nie jest poprawne, powinno byćGuid.NewGuid().ToString() + "." + extension
.txt
czytxt
), ale ponieważChangeExtension
obsługuje oba przypadki, nie może zaszkodzićUwaga: działa to podobnie jak Path.GetTempFileName. Tworzony jest pusty plik, aby zarezerwować nazwę pliku. Wykonuje 10 prób w przypadku kolizji generowanych przez Path.GetRandomFileName ();
źródło
Path.GetRandomFileName()
faktycznie tworzy plik zero-bajtowy na dysku i zwraca pełną ścieżkę tego pliku. Nie używasz tego pliku, a jedynie jego nazwa do zmiany rozszerzenia. Jeśli więc nie upewnisz się, że usuwasz te pliki tymczasowe, po 65535 wywołaniach tej funkcji zacznie się to nie powieść.GetTempFileName()
iGetRandomFileName()
.GetTempFileName()
utwórz plik zerowy jak w mojej metodzie, aleGetRandomFileName()
nie tworzy pliku. Z dokumentacji:> W przeciwieństwie do GetTempFileName, GetRandomFileName nie tworzy pliku. Twój link prowadzi do niewłaściwej strony.Możesz także alternatywnie użyć System.CodeDom.Compiler.TempFileCollection .
Tutaj użyłem rozszerzenia txt, ale możesz określić, co chcesz. Ustawiłem również flagę keep na wartość true, aby plik tymczasowy był zachowywany po użyciu. Niestety TempFileCollection tworzy jeden losowy plik na rozszerzenie. Jeśli potrzebujesz więcej plików tymczasowych, możesz utworzyć wiele instancji TempFileCollection.
źródło
Dlaczego nie sprawdzić, czy plik istnieje?
źródło
Dokumentacja MSDN dla GetTempFileName w C ++ omawia twoje obawy i odpowiada na nie:
źródło
Co powiesz na:
Jest wysoce nieprawdopodobne, aby komputer wygenerował tego samego Guida w tym samym momencie. Jedyną słabością, którą tu widzę, jest wpływ DateTime.Now.Ticks na wydajność.
źródło
Możesz także wykonać następujące czynności
i to również działa zgodnie z oczekiwaniami
źródło
Moim zdaniem większość odpowiedzi zaproponowano tutaj jako nieoptymalne. Najbliżej jest oryginalny zaproponowany początkowo przez Branna.
Nazwa pliku tymczasowego musi być
Z powodu tych wymagań nie jest cholernym pomysłem samodzielne zaprogramowanie takiej bestii. Inteligentni ludzie piszący biblioteki IO martwią się takimi rzeczami jak blokowanie (w razie potrzeby) itp. Dlatego nie widzę potrzeby przepisywania System.IO.Path.GetTempFileName ().
To, nawet jeśli wygląda na niezdarne, powinno wykonać zadanie:
źródło
File.Move
podnosi,IOException
jeśli plik docelowy już istnieje. msdn.microsoft.com/en-us/library/…Może ci się to przydać ... Aby stworzyć temp. folder i zwróć jako ciąg w VB.NET.
Łatwo konwertowalny do C #:
źródło
Wydaje mi się, że to działa dobrze: sprawdza obecność pliku i tworzy plik, aby upewnić się, że jest to zapisywalna lokalizacja. Powinien działać poprawnie, możesz go zmienić, aby zwracał bezpośrednio FileStream (co zwykle jest potrzebne do pliku tymczasowego):
źródło
Łatwa funkcja w C #:
źródło
Mam mieszane @Maxence i @Mitch Pszenica odpowiedzi pamiętając chcę semantyczne metody GetTempFileName (nazwa pliku to nazwa nowego pliku utworzonego) dodanie rozszerzenia preferowany.
źródło
Oto co robię:
źródło
Jest to prosty, ale skuteczny sposób generowania przyrostowych nazw plików. Będzie szukał bezpośrednio w bieżącym (możesz łatwo wskazać to gdzie indziej) i szukał plików za pomocą podstawowej YourApplicationName * .txt (ponownie możesz to łatwo zmienić). Rozpocznie się o 0000, tak aby pierwsza nazwa pliku to YourApplicationName0000.txt. jeśli z jakiegoś powodu istnieją nazwy plików ze śmieciami (czyli nie liczbami) między lewą a prawą częścią, pliki te zostaną zignorowane na podstawie wywołania tryparse.
źródło
Na podstawie odpowiedzi, które znalazłem w Internecie, dochodzę do mojego kodu w następujący sposób:
Jak wskazał Jay Hilyard w książce kucharskiej C #, Stephen Teilhet wskazał na użycie pliku tymczasowego w aplikacji :
powinieneś użyć pliku tymczasowego, ilekroć potrzebujesz tymczasowo przechowywać informacje do późniejszego pobrania.
Jedyną rzeczą, o której musisz pamiętać, jest usunięcie tego pliku tymczasowego przed zakończeniem aplikacji, która go utworzyła.
Jeśli nie zostanie usunięty, pozostanie w katalogu tymczasowym użytkownika, dopóki użytkownik nie usunie go ręcznie.
źródło
Myślę, że powinieneś spróbować:
Generuje unikalną nazwę pliku i tworzy plik o tej nazwie w określonej lokalizacji.
źródło