Apakah .NET Framework memiliki metode apa pun untuk mengubah jalur (mis. "C:\whatever.txt"
) Menjadi file URI (mis "file:///C:/whatever.txt"
)?
Kelas System.Uri memiliki kebalikannya (dari file URI ke path absolut), tetapi tidak sejauh yang dapat saya temukan untuk mengonversi ke file URI.
Juga, ini bukan aplikasi ASP.NET.
var path = new Uri("file:///C:/whatever.txt").LocalPath;
mengubah Uri kembali menjadi filepath lokal juga untuk siapa saja yang membutuhkan ini.new Uri(@"C:\%51.txt").AbsoluteUri
memberi Anda"file:///C:/Q.txt"
alih-alih"file:///C:/%2551.txt"
Apa yang tampaknya tidak disadari siapa pun adalah bahwa tidak satu pun
System.Uri
konstruktor yang menangani dengan benar jalur tertentu dengan tanda persen di dalamnya.Ini memberi Anda
"file:///C:/Q.txt"
alih-alih"file:///C:/%2551.txt"
.Tidak ada nilai dari argumen dontEscape yang ditinggalkan membuat perbedaan, dan menentukan UriKind memberikan hasil yang sama juga. Mencoba dengan UriBuilder juga tidak membantu:
Ini juga kembali
"file:///C:/Q.txt"
.Sejauh yang saya tahu kerangka sebenarnya tidak memiliki cara untuk melakukan ini dengan benar.
Kita dapat mencobanya dengan mengganti garis miring terbalik dengan garis miring ke depan dan memberi makan jalur ke
Uri.EscapeUriString
- yaituIni tampaknya bekerja pada awalnya, tetapi jika Anda memberikan jalan
C:\a b.txt
maka Anda berakhir denganfile:///C:/a%2520b.txt
bukannyafile:///C:/a%20b.txt
- entah bagaimana itu memutuskan bahwa beberapa urutan harus diterjemahkan tetapi tidak yang lain. Sekarang kita bisa awalan dengan"file:///"
diri kita sendiri, tetapi ini gagal untuk mengambil jalur UNC seperti\\remote\share\foo.txt
memperhitungkan - apa yang tampaknya diterima secara umum pada Windows adalah mengubahnya menjadi uraian semu formulirfile://remote/share/foo.txt
, jadi kita juga harus memperhitungkannya.EscapeUriString
juga memiliki masalah yang tidak luput dari'#'
karakter. Tampaknya pada titik ini kita tidak punya pilihan lain selain membuat metode sendiri dari awal. Jadi ini yang saya sarankan:Ini sengaja menyisakan + dan: tidak ter-enkripsi seperti yang biasanya dilakukan pada Windows. Itu juga hanya mengkodekan latin1 karena Internet Explorer tidak dapat memahami karakter unicode dalam url file jika mereka dikodekan.
sumber
Solusi di atas tidak berfungsi di Linux.
Menggunakan .NET Core, berusaha untuk mengeksekusi
new Uri("/home/foo/README.md")
hasil dalam pengecualian:Anda perlu memberi CLR beberapa petunjuk tentang jenis URL apa yang Anda miliki.
Ini bekerja:
... dan string yang dikembalikan oleh
fileUri.ToString()
adalah"file:///home/foo/README.md"
Ini juga berfungsi pada Windows.
new Uri(new Uri("file://"), @"C:\Users\foo\README.md").ToString()
... memancarkan
"file:///C:/Users/foo/README.md"
sumber
new Uri("/path/to/file", UriKind.Absolute);
VB.NET:
Keluaran yang berbeda:
Satu liner:
sumber
AbsoluteUri
adalah yang benar karena ia mengkodekan juga spasi ke% 20.Setidaknya dalam .NET 4.5+ Anda juga dapat melakukan:
sumber
UriFormatException
satu hari?new Uri(@"C:\%51.txt",UriKind.Absolute).AbsoluteUri
kembali"file:///C:/Q.txt"
sebagai ganti"file:///C:/%2551.txt"
UrlCreateFromPath untuk menyelamatkan! Yah, tidak sepenuhnya, karena tidak mendukung format jalur UNC yang diperluas dan, tapi itu tidak terlalu sulit untuk diatasi:
Jika path dimulai dengan awalan khusus, itu akan dihapus. Meskipun dokumentasi tidak menyebutkannya, fungsinya menampilkan panjang URL bahkan jika buffer lebih kecil, jadi saya pertama mendapatkan panjangnya dan kemudian mengalokasikan buffer.
Beberapa pengamatan yang sangat menarik yang saya miliki adalah ketika "\\ device \ path" diubah dengan benar menjadi "file: // device / path", khususnya "\\ localhost \ path" ditransformasikan menjadi hanya "file: /// path" .
Fungsi WinApi berhasil menyandikan karakter khusus, tetapi membiarkan karakter khusus Unicode tidak terbaca, tidak seperti konstruktor Uri . Dalam hal ini, AbsoluteUri berisi URL yang disandikan dengan benar, sementara OriginalString dapat digunakan untuk mempertahankan karakter Unicode.
sumber
Solusinya sederhana. Cukup gunakan metode Uri (). ToString () dan persen-enkode white-space, jika ada, sesudahnya.
mengembalikan file dengan benar : /// C: / my% 20example ㄓ .txt
sumber