Jaki jest najlepszy sposób na uzyskanie nazwy katalogu tymczasowego w systemie Windows? Widzę, że mogę użyć GetTempPath
i GetTempFileName
utworzyć plik tymczasowy, ale czy istnieje odpowiednik funkcji Linux / BSD mkdtemp
do tworzenia katalogu tymczasowego?
c#
.net
windows
temporary-directory
Josh Kelley
źródło
źródło
Odpowiedzi:
Nie, nie ma odpowiednika mkdtemp. Najlepszą opcją jest użycie kombinacji GetTempPath i GetRandomFileName .
Potrzebowałbyś kodu podobnego do tego:
źródło
Siekać
Path.GetTempFileName()
aby podać mi prawidłową, pseudolosową ścieżkę do pliku na dysku, a następnie usuwam plik i tworzę katalog z tą samą ścieżką do pliku.Dzięki temu nie trzeba sprawdzać, czy ścieżka pliku jest dostępna przez chwilę lub w pętli, zgodnie z komentarzem Chrisa na temat odpowiedzi Scotta Dormana.
Jeśli naprawdę potrzebujesz bezpiecznej kryptograficznie losowej nazwy, możesz dostosować odpowiedź Scotta, aby wykorzystywała chwilę lub pętlę do kontynuowania próby utworzenia ścieżki na dysku.
źródło
Lubię używać GetTempPath (), funkcji tworzenia GUID, takiej jak CoCreateGuid () i CreateDirectory ().
Identyfikator GUID został zaprojektowany tak, aby mieć duże prawdopodobieństwo unikalności, a także jest wysoce nieprawdopodobne, aby ktoś ręcznie utworzył katalog o takiej samej formie jak identyfikator GUID (a jeśli tak, metoda CreateDirectory () nie wskaże jego istnienia).
źródło
@Chris. Ja również miałem obsesję na punkcie zdalnego ryzyka, że katalog tymczasowy może już istnieć. Dyskusje o losowości i silnych kryptograficznie również mnie nie satysfakcjonują.
Moje podejście opiera się na podstawowym fakcie, że system operacyjny nie może pozwolić 2 wywołaniom na utworzenie pliku, aby oba zakończyły się pomyślnie. Trochę zaskakujące jest to, że projektanci .NET zdecydowali się ukryć funkcjonalność Win32 API dla katalogów, co znacznie to ułatwia, ponieważ zwraca błąd, gdy próbujesz utworzyć katalog po raz drugi. Oto czego używam:
To Ty decydujesz, czy „koszt / ryzyko” niezarządzanego kodu p / invoke jest tego warte. Większość powie, że tak nie jest, ale przynajmniej masz teraz wybór.
CreateParentFolder () pozostaje jako ćwiczenie dla ucznia. Używam Directory.CreateDirectory (). Uważaj, aby uzyskać katalog nadrzędny, ponieważ w katalogu głównym jest on pusty.
źródło
Zwykle używam tego:
Jeśli chcesz mieć absolutną pewność, że ta nazwa katalogu nie będzie istniała w ścieżce tymczasowej, musisz sprawdzić, czy ta unikalna nazwa katalogu istnieje i spróbować utworzyć inny, jeśli naprawdę istnieje.
Ale ta implementacja oparta na identyfikatorze GUID jest wystarczająca. Nie mam doświadczenia z żadnym problemem w tym przypadku. Niektóre aplikacje MS używają również katalogów tymczasowych opartych na GUID.
źródło
GetTempPath to właściwy sposób na zrobienie tego; Nie jestem pewien, jakie masz obawy dotyczące tej metody. Następnie możesz użyć CreateDirectory, aby to zrobić.
źródło
Oto nieco bardziej brutalne podejście do rozwiązania problemu kolizji nazw katalogów tymczasowych. Nie jest to niezawodne podejście, ale znacznie zmniejsza ryzyko kolizji ścieżki folderu.
Można by potencjalnie dodać inne informacje związane z procesem lub zespołem do nazwy katalogu, aby kolizja była jeszcze mniej prawdopodobna, chociaż wyświetlanie takich informacji w nazwie katalogu tymczasowego może nie być pożądane. Można również mieszać kolejność łączenia pól związanych z czasem, aby nazwy folderów wyglądały bardziej losowo. Osobiście wolę zostawić to w ten sposób po prostu dlatego, że łatwiej mi je wszystkie znaleźć podczas debugowania.
źródło
Jak wspomniano powyżej, Path.GetTempPath () jest jednym ze sposobów na zrobienie tego. Możesz również wywołać zmienną Environment.GetEnvironmentVariable („TEMP”) jeśli użytkownik ma skonfigurowaną zmienną środowiskową TEMP.
Jeśli planujesz używać katalogu tymczasowego jako środka do utrwalania danych w aplikacji, prawdopodobnie powinieneś przyjrzeć się użyciu IsolatedStorage jako repozytorium konfiguracji / stanu / itp ...
źródło