Saya perlu membuat file sementara yang unik dengan ekstensi .csv.
Yang saya lakukan sekarang adalah
string filename = System.IO.Path.GetTempFileName().Replace(".tmp", ".csv");
Namun, ini tidak menjamin bahwa file .csv saya akan unik.
Saya tahu kemungkinan saya pernah mengalami tabrakan sangat rendah (terutama jika Anda menganggap bahwa saya tidak menghapus file .tmp), tetapi kode ini tidak terlihat baik bagi saya.
Tentu saja saya bisa secara manual menghasilkan nama file acak sampai akhirnya saya menemukan yang unik (yang seharusnya tidak menjadi masalah), tetapi saya ingin tahu apakah orang lain telah menemukan cara yang bagus untuk mengatasi masalah ini.
c#
.net
temporary-files
Brann
sumber
sumber
GetTempFileName()
membuat file baru setiap kali Anda menyebutnya. - Jika Anda segera mengubah string ke sesuatu yang lain, Anda baru saja membuat file nol byte baru di direktori temp Anda (dan seperti yang telah dicatat orang lain, ini pada akhirnya akan menyebabkannya gagal ketika Anda menekan 65535 file di sana ...) - - Untuk menghindari ini, pastikan untuk menghapus file yang Anda buat di folder itu (termasuk yang dikembalikan olehGetTempFileName()
, idealnya di blok akhirnya).Jawaban:
Dijamin unik (secara statistik):
(Mengutip dari artikel wiki tentang kemungkinan tabrakan:
EDIT: Silakan juga lihat komentar JaredPar.
sumber
Coba fungsi ini ...
Ini akan mengembalikan jalur penuh dengan ekstensi pilihan Anda.
Catatan, itu tidak dijamin untuk menghasilkan nama file unik karena orang lain secara teknis sudah dapat membuat file itu. Namun kemungkinan seseorang menebak panduan berikutnya yang dihasilkan oleh aplikasi Anda dan membuatnya sangat sangat rendah. Cukup aman untuk menganggap ini akan menjadi unik.
sumber
Guid.NewGuid().ToString() + extension
bahkan tidak benar, seharusnyaGuid.NewGuid().ToString() + "." + extension
.txt
atautxt
) tetapi karenaChangeExtension
menangani kedua kasus, tidak ada salahnyaCatatan: ini berfungsi seperti Path.GetTempFileName. File kosong dibuat untuk memesan nama file. Itu membuat 10 upaya, dalam kasus tabrakan yang dihasilkan oleh Path.GetRandomFileName ();
sumber
Path.GetRandomFileName()
sebenarnya membuat file nol-byte pada disk dan mengembalikan path lengkap file itu. Anda tidak menggunakan file ini, hanya namanya untuk mengubah ekstensi. Jadi, jika Anda tidak memastikan bahwa Anda menghapus file sementara ini, setelah 65535 panggilan ke fungsi ini akan mulai gagal.GetTempFileName()
danGetRandomFileName()
.GetTempFileName()
buat file nol-byte seperti metode saya, tetapiGetRandomFileName()
tidak membuat file. Dari dokumen:> Tidak seperti GetTempFileName, GetRandomFileName tidak membuat file. Tautan Anda mengarah ke halaman yang salah.Anda juga dapat menggunakan System.CodeDom.Compiler.TempFileCollection .
Di sini saya menggunakan ekstensi txt tetapi Anda dapat menentukan apa pun yang Anda inginkan. Saya juga mengatur flag tetap ke true sehingga file temp disimpan setelah digunakan. Sayangnya, TempFileCollection membuat satu file acak per ekstensi. Jika Anda membutuhkan lebih banyak file temp, Anda dapat membuat beberapa instance TempFileCollection.
sumber
Mengapa tidak memeriksa apakah file itu ada?
sumber
Dokumentasi MSDN untuk GetTempFileName C ++ membahas masalah Anda dan menjawabnya:
sumber
Bagaimana tentang:
Sangat tidak mungkin bahwa komputer akan menghasilkan Guid yang sama pada saat yang bersamaan. Satu-satunya kelemahan yang saya lihat di sini adalah dampak kinerja DateTime.Now.Ticks akan menambahkan.
sumber
Anda juga dapat melakukan hal berikut
dan ini juga berfungsi seperti yang diharapkan
sumber
Menurut pendapat saya, sebagian besar jawaban yang diajukan di sini sebagai kurang optimal. Yang paling dekat adalah yang asli yang diusulkan pada awalnya oleh Brann.
Nama file Temp harus
Karena persyaratan ini, itu bukan ide yang bagus untuk memprogram binatang buas seperti itu sendiri. Orang-orang pintar yang menulis Perpustakaan IO khawatir tentang hal-hal seperti penguncian (jika perlu) dll. Oleh karena itu, saya melihat tidak perlu menulis ulang System.IO.Path.GetTempFileName ().
Ini, meskipun terlihat canggung, harus melakukan pekerjaan:
sumber
File.Move
memunculkanIOException
jika file tujuan sudah ada. msdn.microsoft.com/en-us/library/…Ini bisa berguna untuk Anda ... Ini untuk membuat temp. folder dan mengembalikannya sebagai string di VB.NET.
Mudah dikonversi ke C #:
sumber
Ini sepertinya berfungsi dengan baik bagi saya: memeriksa keberadaan file dan membuat file untuk memastikan itu adalah lokasi yang dapat ditulis. Seharusnya berfungsi dengan baik, Anda dapat mengubahnya untuk mengembalikan langsung FileStream (yang biasanya Anda butuhkan untuk file temp):
sumber
Fungsi mudah di C #:
sumber
Berdasarkan jawaban yang saya temukan dari internet, saya membuka kode saya sebagai berikut:
Dan seperti C # Cookbook oleh Jay Hilyard, Stephen Teilhet menunjuk dalam Menggunakan File Sementara di Aplikasi Anda :
Anda harus menggunakan file sementara kapan pun Anda perlu menyimpan informasi sementara untuk pengambilan nanti.
Satu hal yang harus Anda ingat adalah menghapus file sementara ini sebelum aplikasi yang membuatnya dihentikan.
Jika tidak dihapus, itu akan tetap berada di direktori sementara pengguna sampai pengguna menghapusnya secara manual.
sumber
Saya mencampur @Maxence dan @Mitch Wheat menjawab dengan mengingat bahwa saya ingin semantik metode GetTempFileName (fileName adalah nama file baru yang dibuat) menambahkan ekstensi yang disukai.
sumber
Inilah yang saya lakukan:
sumber
Ini adalah cara sederhana namun efektif untuk menghasilkan nama file tambahan. Ini akan melihat langsung saat ini (Anda dapat dengan mudah mengarahkannya ke tempat lain) dan mencari file dengan basis YourApplicationName * .txt (sekali lagi Anda dapat dengan mudah mengubahnya). Ini akan dimulai pada 0000 sehingga nama file pertama adalah YourApplicationName0000.txt. jika karena alasan tertentu ada nama file dengan junk antara (artinya bukan angka) bagian kiri dan kanan, file-file itu akan diabaikan berdasarkan panggilan tryparse.
sumber
Saya pikir Anda harus mencoba ini:
Ini menghasilkan nama file unik dan membuat file dengan nama file itu di lokasi yang ditentukan.
sumber