Apa cara terbaik untuk mendapatkan nama direktori temp di Windows? Saya melihat bahwa saya dapat menggunakan GetTempPath
dan GetTempFileName
membuat file sementara, tetapi apakah ada yang setara dengan fungsi Linux / BSD mkdtemp
untuk membuat direktori sementara?
c#
.net
windows
temporary-directory
Josh Kelley
sumber
sumber
Jawaban:
Tidak, tidak ada yang setara dengan mkdtemp. Pilihan terbaik adalah menggunakan kombinasi GetTempPath dan GetRandomFileName .
Anda akan membutuhkan kode yang mirip dengan ini:
sumber
Saya meretas
Path.GetTempFileName()
untuk memberi saya jalur file pseudo-acak yang valid pada disk, lalu menghapus file, dan membuat direktori dengan jalur file yang sama.Ini menghindari kebutuhan untuk memeriksa apakah jalur file tersedia dalam beberapa saat atau berulang, sesuai komentar Chris atas jawaban Scott Dorman.
Jika Anda benar-benar membutuhkan nama acak yang aman secara kriptografik, Anda mungkin ingin menyesuaikan jawaban Scott untuk menggunakan beberapa saat atau melakukan loop untuk terus mencoba membuat jalur pada disk.
sumber
Saya suka menggunakan GetTempPath (), fungsi pembuatan GUID seperti CoCreateGuid (), dan CreateDirectory ().
GUID dirancang untuk memiliki kemungkinan keunikan yang tinggi, dan juga sangat tidak mungkin seseorang secara manual membuat direktori dengan bentuk yang sama dengan GUID (dan jika mereka melakukannya maka CreateDirectory () akan gagal menunjukkan keberadaannya.)
sumber
@Tokopedia Saya juga terobsesi dengan risiko jarak jauh bahwa direktori sementara mungkin sudah ada. Diskusi tentang acak dan kuat secara kriptografis juga tidak sepenuhnya memuaskan saya.
Pendekatan saya dibangun di atas fakta mendasar bahwa O / S tidak boleh mengizinkan 2 panggilan untuk membuat file agar keduanya berhasil. Sedikit mengherankan bahwa perancang .NET memilih untuk menyembunyikan fungsionalitas Win32 API untuk direktori, yang membuatnya lebih mudah, karena ini mengembalikan kesalahan saat Anda mencoba membuat direktori untuk kedua kalinya. Inilah yang saya gunakan:
Anda dapat memutuskan apakah "biaya / risiko" dari kode p / pemanggilan yang tidak dikelola sepadan. Sebagian besar akan mengatakan tidak, tetapi setidaknya Anda sekarang punya pilihan.
CreateParentFolder () ditinggalkan sebagai latihan untuk siswa. Saya menggunakan Directory.CreateDirectory (). Berhati-hatilah saat mendapatkan induk direktori, karena nilainya null saat berada di root.
sumber
Saya biasanya menggunakan ini:
Jika Anda ingin benar-benar yakin bahwa nama direktori ini tidak akan ada di jalur sementara, Anda perlu memeriksa apakah nama direktori unik ini ada dan mencoba membuat yang lain jika benar-benar ada.
Tapi implementasi berbasis GUID ini sudah cukup. Saya tidak punya pengalaman dengan masalah apa pun dalam kasus ini. Beberapa aplikasi MS menggunakan direktori temp berbasis GUID juga.
sumber
GetTempPath adalah cara yang benar untuk melakukannya; Saya tidak yakin apa kekhawatiran Anda tentang metode ini. Anda kemudian dapat menggunakan CreateDirectory untuk membuatnya.
sumber
Berikut adalah pendekatan yang lebih kasar untuk menyelesaikan masalah tabrakan untuk nama direktori sementara. Ini bukan pendekatan yang sempurna, tetapi secara signifikan mengurangi kemungkinan tabrakan jalur folder.
Seseorang berpotensi menambahkan proses lain atau informasi terkait perakitan ke nama direktori untuk membuat tabrakan lebih kecil kemungkinannya, meskipun membuat informasi seperti itu terlihat pada nama direktori sementara mungkin tidak diinginkan. Anda juga dapat mencampur urutan penggabungan bidang terkait waktu untuk membuat nama folder terlihat lebih acak. Saya pribadi lebih suka membiarkannya seperti itu hanya karena lebih mudah bagi saya untuk menemukan semuanya selama debugging.
sumber
Seperti disebutkan di atas, Path.GetTempPath () adalah salah satu cara untuk melakukannya. Anda juga dapat memanggil Environment.GetEnvironmentVariable ("TEMP") jika pengguna telah menyiapkan variabel lingkungan TEMP.
Jika Anda berencana menggunakan direktori temp sebagai sarana untuk menyimpan data dalam aplikasi, Anda mungkin harus menggunakan IsolatedStorage sebagai repositori untuk konfigurasi / status / dll ...
sumber