Saya tahu bahwa / itu ilegal di Linux, dan berikut ini ilegal di Windows (saya pikir) *
.
"
/
\
[
]
:
;
|
,
Apa lagi yang saya lewatkan?
Saya membutuhkan panduan komprehensif, dan yang memperhitungkan karakter bita-ganda. Menghubungkan ke sumber daya luar tidak masalah dengan saya.
Pertama-tama saya perlu membuat direktori pada sistem file menggunakan nama yang mungkin mengandung karakter terlarang, jadi saya berencana untuk mengganti karakter tersebut dengan garis bawah. Saya kemudian perlu menulis direktori ini dan isinya ke file zip (menggunakan Java), jadi saran tambahan tentang nama direktori zip akan dihargai.
echo abc > "ab.;,=[1]"
Jawaban:
"Panduan komprehensif" untuk karakter nama file terlarang tidak akan berfungsi di Windows karena ia menyimpan nama file dan karakter. Ya, karakter seperti
*
"
?
dan yang lain dilarang, tetapi ada sejumlah nama tak terbatas yang hanya terdiri dari karakter yang sah yang dilarang. Misalnya, spasi dan titik adalah karakter nama file yang valid, tetapi nama yang hanya terdiri dari karakter tersebut dilarang.Windows tidak membedakan antara karakter huruf besar dan huruf kecil, jadi Anda tidak dapat membuat folder dengan nama
A
jika salah satu namaa
sudah ada. Lebih buruk, nama-nama yang tampaknya diizinkan sepertiPRN
danCON
, dan banyak lainnya, dicadangkan dan tidak diizinkan. Windows juga memiliki beberapa batasan panjang; nama file yang valid dalam satu folder dapat menjadi tidak valid jika dipindahkan ke folder lain. Aturan untuk menamai file dan folder ada di Microsoft docs.Anda tidak dapat, secara umum, menggunakan teks yang dibuat pengguna untuk membuat nama direktori Windows. Jika Anda ingin memungkinkan pengguna untuk nama apa saja yang mereka inginkan, Anda harus membuat nama-nama yang aman seperti
A
,AB
,A2
et al., Toko nama user-generated dan jalan setara dalam file data aplikasi, dan melakukan pemetaan jalur dalam aplikasi Anda.Jika Anda benar-benar harus mengizinkan nama folder yang dibuat pengguna, satu-satunya cara untuk mengetahui apakah mereka tidak valid adalah dengan menangkap pengecualian dan menganggap nama itu tidak valid. Bahkan itu penuh dengan bahaya, seperti pengecualian untuk akses yang ditolak, drive offline, dan ruang drive yang tumpang tindih dengan yang dapat dibuang untuk nama yang tidak valid. Anda membuka satu kaleng besar luka.
sumber
A.txt
tidak valid karenaa.TXT
mungkin ada.COPY CON PRN
berarti membaca dari input keyboard, atau mungkin stdin, dan menyalinnya ke perangkat printer. Tidak yakin itu masih berlaku di windows modern, tetapi tentu untuk waktu yang lama. Di masa lalu Anda bisa menggunakannya untuk mengetik teks dan memiliki printer dot-matrix cukup output saja.Mari kita tetap sederhana dan jawab pertanyaannya, pertama.
The dilarang karakter ASCII dicetak adalah:
Linux / Unix:
Windows:
Karakter yang tidak dapat dicetak
Jika data Anda berasal dari sumber yang akan mengizinkan karakter yang tidak dapat dicetak maka ada lebih banyak untuk diperiksa.
Linux / Unix:
Windows:
Catatan: Walaupun legal di bawah sistem file Linux / Unix untuk membuat file dengan karakter kontrol dalam nama file, itu mungkin menjadi mimpi buruk bagi pengguna untuk menangani file tersebut .
Nama file yang dicadangkan
Nama file berikut dicadangkan:
Windows:
(baik sendiri dan dengan ekstensi file yang sewenang-wenang, misalnya
LPT1.txt
).Aturan lainnya
Windows:
Nama file tidak boleh diakhiri dengan spasi atau titik.
sumber
Di Linux dan sistem terkait Unix lainnya, hanya ada dua karakter yang tidak dapat muncul dalam nama file atau direktori, dan itu adalah NUL
'\0'
dan slash'/'
. Slash, tentu saja, dapat muncul dalam nama path, memisahkan komponen direktori.Rumor 1 mengatakan bahwa Steven Bourne (dari 'shell' ketenaran) memiliki direktori yang berisi 254 file, satu untuk setiap huruf (kode karakter) yang dapat muncul dalam nama file (tidak termasuk
/
,'\0'
; nama.
itu direktori saat ini, tentu saja ). Itu digunakan untuk menguji shell Bourne dan secara rutin membuat kekacauan pada program yang tidak waspada seperti program cadangan.Orang lain telah membahas aturan Windows.
Perhatikan bahwa MacOS X memiliki sistem file case-insensitive.
1 Adalah Kernighan & Pike dalam Praktek Pemrograman yang mengatakan banyak hal dalam Bab 6, Pengujian, §6,5 Tes Tekanan:
Perhatikan bahwa direktori harus berisi entri
.
dan..
, jadi itu bisa dibilang 253 file (dan 2 direktori), atau 255 entri nama, bukan 254 file. Ini tidak mempengaruhi keefektifan anekdot, atau pengujian hati-hati yang diuraikannya.sumber
/
dalam nama. Itu menyebabkan beberapa masalah, karena membuat direktori baru dengan skema masukPATH
variabel Unix karena titik dua digunakan sebagai pemisah (titik koma pada Windows). Jadi, program dalam direktori seperti itu harus dijalankan dengan pathname yang menentukan di mana itu (bisa relatif atau absolut), atau Anda harus berada di direktori dan memiliki titik (.
, direktori saat ini) diPATH
, yang secara luas dianggap sebagai tidak aman.Alih-alih membuat daftar hitam karakter, Anda bisa menggunakan daftar putih . Semua hal dipertimbangkan, rentang karakter yang masuk akal dalam konteks nama file atau direktori cukup singkat, dan kecuali Anda memiliki persyaratan penamaan yang sangat spesifik, pengguna Anda tidak akan menahannya terhadap aplikasi Anda jika mereka tidak dapat menggunakan seluruh tabel ASCII.
Itu tidak memecahkan masalah nama yang dicadangkan dalam sistem file target, tetapi dengan daftar putih lebih mudah untuk mengurangi risiko pada sumbernya.
Dalam semangat itu, ini adalah serangkaian karakter yang dapat dianggap aman:
Dan setiap karakter aman tambahan yang ingin Anda izinkan. Di luar ini, Anda hanya perlu menegakkan beberapa aturan tambahan tentang ruang dan titik . Ini biasanya cukup:
Ini sudah memungkinkan nama yang cukup kompleks dan tidak masuk akal. Sebagai contoh, nama-nama ini dimungkinkan dengan aturan-aturan ini, dan menjadi nama file yang valid di Windows / Linux:
A...........ext
B -.- .ext
Intinya, bahkan dengan begitu sedikit karakter yang masuk daftar putih Anda masih harus memutuskan apa yang sebenarnya masuk akal, dan memvalidasi / menyesuaikan nama yang sesuai. Di salah satu aplikasi saya, saya menggunakan aturan yang sama seperti di atas tetapi menghapus semua titik dan spasi duplikat.
sumber
Cara mudah untuk membuat Windows memberi tahu Anda jawabannya adalah dengan mencoba mengubah nama file melalui Explorer dan ketik / untuk nama baru. Windows akan memunculkan kotak pesan yang memberitahu Anda daftar karakter ilegal.
https://support.microsoft.com/en-us/kb/177506
sumber
Nah, jika hanya untuk tujuan penelitian, maka taruhan terbaik Anda adalah dengan melihat entri Wikipedia ini pada Nama File .
Jika Anda ingin menulis fungsi portabel untuk memvalidasi input pengguna dan membuat nama file berdasarkan itu, jawaban singkatnya adalah jangan . Lihatlah modul portabel seperti File Perl :: Spec untuk melihat sekilas semua hop yang diperlukan untuk menyelesaikan tugas "sederhana" tersebut.
sumber
Untuk Windows Anda dapat memeriksanya menggunakan PowerShell
Untuk menampilkan kode UTF-8, Anda dapat mengonversi
sumber
Di Windows 10 (2019), karakter berikut dilarang oleh kesalahan saat Anda mencoba mengetiknya:
sumber
Inilah implementasi # ac untuk windows berdasarkan jawaban Christopher Oezbek
Itu dibuat lebih kompleks oleh boolean yang berisi Folder, tapi mudah-mudahan mencakup semuanya
sumber
StringBuilder
dengan nilai kapasitas awal? 2. Mengapa Anda menambahkan 12 ke panjangfilename
? 3. Apakah 12 dipilih secara sewenang-wenang atau apakah ada pemikiran di balik nomor ini?Pada 18/04/2017, tidak ada daftar karakter dan nama file hitam-putih yang jelas di antara jawaban untuk topik ini - dan ada banyak balasan.
Saran terbaik yang bisa saya ajukan adalah membiarkan pengguna memberi nama file tersebut sesuai keinginannya. Menggunakan penangan kesalahan ketika aplikasi mencoba untuk menyimpan file, menangkap pengecualian, menganggap nama file yang harus disalahkan (jelas setelah memastikan path save juga ok), dan meminta pengguna untuk nama file baru. Untuk hasil terbaik, letakkan prosedur pemeriksaan ini dalam satu lingkaran yang berlanjut sampai pengguna benar atau menyerah. Bekerja paling baik untuk saya (setidaknya di VBA).
sumber
Meskipun satu-satunya karakter Unix ilegal mungkin
/
danNULL
, meskipun beberapa pertimbangan untuk interpretasi baris perintah harus dimasukkan.Misalnya, walaupun mungkin sah untuk memberi nama file
1>&2
atau2>&1
di Unix, nama file seperti ini mungkin disalahartikan saat digunakan pada baris perintah.Demikian pula mungkin untuk memberi nama file
$PATH
, tetapi ketika mencoba mengaksesnya dari baris perintah, shell akan menerjemahkan$PATH
ke nilai variabelnya.sumber
$'myvalueis'
, ex:$ echo 'hi' > $'2>&1'
,cat 2\>\&1
"hi"Kesulitan dengan mendefinisikan, apa hukum dan tidak yang sudah adressed dan Whitelist yang disarankan . Tetapi Windows mendukung lebih dari 8-bit karakter. Wikipedia menyatakan , bahwa (misalnya)
Karena itu, saya ingin menyajikan pendekatan yang jauh lebih liberal menggunakan karakter Unicode untuk menggantikan yang "ilegal". Saya menemukan hasilnya dalam kasus penggunaan yang sebanding jauh lebih mudah dibaca. Lihat misalnya ke dalam blok ini . Plus Anda bahkan dapat mengembalikan konten asli dari itu. Pilihan dan penelitian yang memungkinkan disediakan dalam daftar berikut:
U+002A * ASTERISK
), Anda dapat menggunakan salah satu dari banyak yang terdaftar, misalnyaU+2217 ∗ (ASTERISK OPERATOR)
atauFull Width Asterisk U+FF0A *
⋅ U+22C5 dot operator
“ U+201C english leftdoublequotemark
(Alternatif lihat di sini )/ SOLIDUS U+002F
), Anda dapat menggunakan∕ DIVISION SLASH U+2215
(yang lain di sini )\ U+005C Reverse solidus
), Anda dapat menggunakan⧵ U+29F5 Reverse solidus operator
( lebih banyak )U+005B Left square bracket
) dan ](U+005D Right square bracket
), Anda dapat menggunakan misalnyaU+FF3B[ FULLWIDTH LEFT SQUARE BRACKET
danU+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET
(dari sini , lebih banyak kemungkinan di sini )U+2236 ∶ RATIO (for mathematical usage)
atauU+A789 ꞉ MODIFIER LETTER COLON
, (lihat titik dua (huruf)) , kadang-kadang digunakan dalam nama file Windows karena identik dengan titik dua dalam font Segoe UI yang digunakan untuk nama file. Titik dua itu sendiri tidak diizinkan) (Lihat di sini )U+037E ; GREEK QUESTION MARK
(lihat di sini )U+0964 । DEVANAGARI DANDA
,U+2223 ∣ DIVIDES
atauU+01C0 ǀ LATIN LETTER DENTAL CLICK
( Wikipedia ). Juga karakter menggambar kotak berisi berbagai opsi lain., U+002C COMMA
), Anda dapat menggunakan misalnya‚ U+201A SINGLE LOW-9 QUOTATION MARK
(lihat di sini )U+003F ? QUESTION MARK
), ini adalah kandidat yang baik:U+FF1F ? FULLWIDTH QUESTION MARK
atauU+FE56 ﹖ SMALL QUESTION MARK
(dari dia kembali , dua lagi dari Dingbats Block , mencari "pertanyaan")sumber
Saat membuat pintasan internet di Windows, untuk membuat nama file, ia melompati karakter ilegal, kecuali untuk garis miring, yang dikonversi menjadi minus.
sumber
Dalam kerang Unix, Anda dapat mengutip hampir setiap karakter dalam tanda kutip tunggal
'
. Kecuali kutipan tunggal itu sendiri, dan Anda tidak dapat mengekspresikan karakter kontrol, karena\
tidak diperluas. Mengakses kutipan tunggal itu sendiri dari dalam string yang dikutip adalah mungkin, karena Anda dapat menggabungkan string dengan kutipan tunggal dan ganda, seperti'I'"'"'m'
yang dapat digunakan untuk mengakses file yang disebut"I'm"
(penawaran ganda juga dimungkinkan di sini).Jadi Anda harus menghindari semua karakter kontrol, karena mereka terlalu sulit untuk dimasukkan ke dalam shell. Sisanya masih lucu, terutama file yang dimulai dengan tanda hubung, karena sebagian besar perintah membacanya sebagai opsi kecuali Anda memiliki dua tanda hubung
--
sebelumnya, atau Anda menentukannya dengan./
, yang juga menyembunyikan awal-
.Jika Anda ingin bersikap baik, jangan gunakan karakter apa pun yang digunakan shell dan perintah tipikal sebagai elemen sintaksis, terkadang tergantung posisi, jadi mis. Anda masih bisa menggunakan
-
, tetapi tidak sebagai karakter pertama; sama dengan.
, Anda dapat menggunakannya sebagai karakter pertama hanya ketika Anda bersungguh-sungguh ("file tersembunyi"). Ketika Anda jahat, nama file Anda adalah urutan melarikan diri VT100 ;-), sehingga sebuah ls memutarbalikkan output.sumber
Saya memiliki kebutuhan yang sama dan sedang mencari rekomendasi atau referensi standar dan menemukan utas ini. Daftar hitam karakter saya saat ini yang harus dihindari dalam nama file dan direktori adalah:
sumber
@
dalam daftar?b
? lol, saya berasumsi itu b darilank spaces
... yah yang masih menyisakan beberapa ... Saya mengganti nama sebuah foto(),-.;[]^_~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpg
tetapi harus mengubahnya kembali karena tampak marah ...