Saya perlu cara yang kuat dan sederhana untuk menghapus jalur ilegal dan karakter file dari string sederhana. Saya telah menggunakan kode di bawah ini tetapi sepertinya tidak melakukan apa-apa, apa yang saya lewatkan?
using System;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string illegal = "\"M<>\"\\a/ry/ h**ad:>> a\\/:*?\"<>| li*tt|le|| la\"mb.?";
illegal = illegal.Trim(Path.GetInvalidFileNameChars());
illegal = illegal.Trim(Path.GetInvalidPathChars());
Console.WriteLine(illegal);
Console.ReadLine();
}
}
}
GetInvalidFileNameChars()
akan menghapus hal-hal seperti: \ etc dari path folder.Path.GetInvalidPathChars()
tampaknya tidak menelanjangi*
atau?
Jawaban:
Cobalah sesuatu seperti ini sebagai gantinya;
Tapi saya harus setuju dengan komentar, saya mungkin akan mencoba untuk berurusan dengan sumber jalur ilegal, daripada mencoba untuk memotong jalan ilegal ke jalur yang sah tapi mungkin tidak diinginkan.
Sunting: Atau solusi yang berpotensi 'lebih baik', menggunakan Regex.
Namun, pertanyaannya tetap harus ditanyakan, mengapa Anda melakukan ini sejak awal.
sumber
GetInvalidPathChars()
bisa mengandung karakter yangGetInvalidFileNameChars()
tidak. Anda tidak mengambil kebenaran dari optimasi "prematur". Anda hanya menggunakan kode yang salah.Pertanyaan awal yang diminta untuk "menghapus karakter ilegal":
Anda mungkin ingin menggantinya:
Jawaban ini ada di utas lain oleh Ceres , saya sangat suka rapi dan sederhana.
sumber
Saya menggunakan Linq untuk membersihkan nama file. Anda dapat dengan mudah memperluas ini untuk memeriksa jalur yang valid juga.
Memperbarui
Beberapa komentar menunjukkan metode ini tidak berfungsi untuk mereka, jadi saya telah menyertakan tautan ke cuplikan DotNetFiddle sehingga Anda dapat memvalidasi metode ini.
https://dotnetfiddle.net/nw1SWY
sumber
var invalid = new HashSet<char>(Path.GetInvalidPathChars()); return new string(originalString.Where(s => !invalid.Contains(s)).ToArray())
. Kinerja mungkin tidak bagus, tetapi itu mungkin tidak masalah.Anda dapat menghapus karakter ilegal menggunakan Linq seperti ini:
EDIT
Ini adalah tampilannya dengan pengeditan yang diperlukan yang disebutkan dalam komentar:
sumber
Ini semua adalah solusi hebat, tetapi mereka semua bergantung
Path.GetInvalidFileNameChars
, yang mungkin tidak dapat diandalkan seperti yang Anda pikirkan. Perhatikan komentar berikut dalam dokumentasi MSDN padaPath.GetInvalidFileNameChars
:Ini tidak lebih baik dengan
Path.GetInvalidPathChars
metode. Ini berisi komentar yang sama persis.sumber
Untuk nama file:
Untuk jalur lengkap:
Perhatikan bahwa jika Anda bermaksud menggunakan ini sebagai fitur keamanan, pendekatan yang lebih kuat adalah dengan memperluas semua jalur dan kemudian memverifikasi bahwa jalur yang disediakan pengguna memang merupakan anak dari direktori yang harus diakses oleh pengguna.
sumber
Sebagai permulaan, Trim hanya menghilangkan karakter dari awal atau akhir string . Kedua, Anda harus mengevaluasi apakah Anda benar-benar ingin menghapus karakter ofensif, atau gagal cepat dan biarkan pengguna tahu nama file mereka tidak valid. Pilihan saya adalah yang terakhir, tetapi jawaban saya setidaknya harus menunjukkan kepada Anda bagaimana melakukan sesuatu dengan cara yang benar DAN salah:
Pertanyaan StackOverflow menunjukkan bagaimana memeriksa apakah string yang diberikan adalah nama file yang valid . Catatan Anda dapat menggunakan regex dari pertanyaan ini untuk menghapus karakter dengan penggantian ekspresi reguler (jika Anda benar-benar perlu melakukan ini).
sumber
Cara terbaik untuk menghapus karakter ilegal dari input pengguna adalah mengganti karakter ilegal menggunakan kelas Regex, membuat metode dalam kode di belakang atau juga memvalidasi di sisi klien menggunakan kontrol RegularExpression.
ATAU
sumber
Saya menggunakan ekspresi reguler untuk mencapai ini. Pertama, saya secara dinamis membangun regex.
Kemudian saya panggil removeInvalidChars.Replace untuk melakukan pencarian dan penggantian. Ini jelas dapat diperluas untuk mencakup karakter jalur juga.
sumber
new Regex(String.Format("^(CON|PRN|AUX|NUL|CLOCK\$|COM[1-9]|LPT[1-9])(?=\..|$)|(^(\.+|\s+)$)|((\.+|\s+)$)|([{0}])", Regex.Escape(new String(Path.GetInvalidFileNameChars()))), RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.CultureInvariant);
Saya benar-benar menyukai gagasan Jeff Yates. Ini akan bekerja dengan sempurna, jika Anda sedikit memodifikasinya:
Peningkatan ini hanya untuk menghindari regex yang dibuat secara otomatis.
sumber
Berikut cuplikan kode yang akan membantu untuk .NET 3 dan lebih tinggi.
sumber
Sebagian besar solusi di atas menggabungkan karakter ilegal untuk path dan nama file yang salah (bahkan ketika kedua panggilan saat ini mengembalikan kumpulan karakter yang sama). Saya pertama-tama akan membagi path + nama file di jalur dan nama file, kemudian menerapkan set yang sesuai baik jika mereka dan kemudian menggabungkan keduanya lagi.
wvd_vegt
sumber
Jika Anda menghapus atau mengganti satu karakter dengan karakter yang tidak valid, Anda dapat mengalami tabrakan:
Berikut adalah metode sederhana untuk menghindari ini:
Hasil:
sumber
Lempar pengecualian.
sumber
Saya menulis monster ini untuk bersenang-senang, itu memungkinkan Anda pulang pergi:
sumber
Saya pikir jauh lebih mudah untuk memvalidasi menggunakan regex dan menentukan karakter mana yang diperbolehkan, daripada mencoba memeriksa semua karakter buruk. Lihat tautan ini: http://www.c-sharpcorner.com/UploadFile/prasad_1/RegExpPSD12062005021717AM/RegExpPSD.aspx http://www.windowsdevcenter.com/pub/a/oreilly/windows/news/csharp_0101.html
Juga, lakukan pencarian untuk "editor ekspresi reguler", mereka banyak membantu. Ada beberapa yang bahkan mengeluarkan kode dalam c # untuk Anda.
sumber
Ini tampaknya O (n) dan tidak menghabiskan terlalu banyak memori pada string:
sumber
Memindai jawaban di sini, semuanya ** tampaknya melibatkan penggunaan array karakter karakter nama file yang tidak valid.
Memang, ini mungkin mikro-optimasi - tetapi untuk kepentingan siapa pun yang mungkin mencari untuk memeriksa sejumlah besar nilai untuk menjadi nama file yang valid, perlu dicatat bahwa membangun hashset karakter yang tidak valid akan menghasilkan kinerja yang jauh lebih baik.
Saya sangat terkejut (terkejut) di masa lalu seberapa cepat hashset (atau kamus) mengungguli iterasi pada daftar. Dengan string, ini adalah angka yang sangat rendah (sekitar 5-7 item dari memori). Dengan sebagian besar data sederhana lainnya (referensi objek, angka, dll), crossover ajaib tampaknya ada sekitar 20 item.
Ada 40 karakter yang tidak valid di "daftar" Path.InvalidFileNameChars. Melakukan pencarian hari ini dan ada patokan yang cukup bagus di sini di StackOverflow yang menunjukkan hashset akan mengambil sedikit lebih dari setengah waktu array / daftar untuk 40 item: https://stackoverflow.com/a/10762995/949129
Inilah kelas pembantu yang saya gunakan untuk membersihkan jalur. Saya lupa sekarang mengapa saya memiliki opsi penggantian yang mewah di dalamnya, tetapi itu ada sebagai bonus lucu.
Metode bonus tambahan "IsValidLocalPath" juga :)
(** Yang tidak menggunakan ekspresi reguler)
sumber
Anda dapat menggunakan metode dengan jelas.
sumber
Nama file tidak boleh mengandung karakter dari
Path.GetInvalidPathChars()
,+
dan#
simbol, dan nama spesifik lainnya. Kami menggabungkan semua cek menjadi satu kelas:Metode
GetValidFileName
menggantikan semua data yang salah_
.sumber
Satu liner untuk membersihkan string dari karakter ilegal apa pun untuk penamaan file windows:
sumber
sumber
Ini akan seperti yang Anda inginkan, dan menghindari tabrakan
sumber
Saya pikir pertanyaan sudah tidak dijawab penuh ... Jawabannya hanya menggambarkan nama file bersih ATAU jalur ... tidak keduanya. Inilah solusi saya:
sumber
Saya membuat metode ekstensi yang menggabungkan beberapa saran:
Sumber:
sumber
Berikut adalah fungsi yang menggantikan semua karakter ilegal dalam nama file dengan karakter pengganti:
Misalnya garis bawah dapat digunakan sebagai karakter pengganti:
sumber
Atau Anda bisa melakukannya
sumber