Karakter yang diizinkan dalam nama file [ditutup]

145

Di mana saya dapat menemukan daftar karakter yang diperbolehkan dalam nama file, bergantung pada sistem operasinya? (mis. di Linux, karakter :diperbolehkan dalam nama file, tetapi tidak di Windows)

python bung
sumber
.NET menyediakan info itu untuk Windows.
leppie
9
@kreker perhatikan bahwa pertanyaan Anda adalah tentang Android
congusbongus

Jawaban:

115

Anda harus mulai dengan halaman Nama File Wikipedia . Ini memiliki tabel berukuran layak ( Perbandingan batasan nama file ), mencantumkan karakter yang dicadangkan untuk cukup banyak sistem file.

Ia juga memiliki sejumlah besar informasi lain tentang setiap sistem file, termasuk nama file yang dicadangkan seperti di CONbawah MS-DOS. Saya menyebutkan itu hanya karena saya pernah digigit oleh itu ketika saya mempersingkat file include dari const.hmenjadi con.hdan menghabiskan setengah jam untuk mencari tahu mengapa kompiler hang.

Ternyata DOS mengabaikan ekstensi untuk perangkat sehingga con.hpersis sama dengan con, konsol input (artinya, tentu saja, kompilator menunggu saya untuk mengetikkan file header sebelum melanjutkan).

paxdiablo
sumber
4
Saya menemukan halaman Wikipedia agak kabur dan membingungkan, misalnya "Beberapa sistem operasi melarang beberapa karakter tertentu ...". Saya sebenarnya mencari tabel lengkap yang mencantumkan semua karakter yang diizinkan dan tidak diizinkan.
pria python
7
@python, jangan lihat tabel itu, lihat tabel besar di bawahnya (berjudul "Perbandingan batasan nama file"). Isinya tidak begitu kabur.
paxdiablo
56
Mungkin yang Anda butuhkan hanyalah melihat POSIX "Fully portable filenames"entri, yang mencantumkan ini:A–Z a–z 0–9 . _ -
Vladimir Kornea
1
@VladimirKornea terima kasih! Tautan: pubs.opengroup.org/onlinepubs/9699919799/basedefs/… || pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CpILL Ada lebih banyak OS daripada hanya Windows, OSX dan Linux ... beberapa memiliki sistem file yang sangat sederhana.
dadu elegan
40

Oke, jadi lihat Perbandingan sistem file jika Anda hanya peduli tentang sistem file pemain utama:

sehingga setiap byte kecuali NUL, \, /, :, *, ", <, >, |dan Anda tidak dapat memiliki file / folder menelepon .atau ..dan tidak ada karakter kontrol (tentu saja).

CpILL
sumber
8
Ini tidak benar. Linux tidak mengizinkan /. Windows tidak mengizinkan garis miring terbalik dan beberapa string (misalnya CON).
kgadek
8
ya, maka saya berkata kecuali .
CpILL
3
Di Mac (menjalankan HFS +), saya dapat membuat file dengan :s dalam namanya.
erwaman
Ini tidak benar. Lihat jawaban ini untuk mengetahui lebih banyak karakter yang tidak diizinkan Windows.
mbomb007
Windows juga tidak mengizinkan karakter kontrol apa pun (tetapi Mac melakukannya, selain NUL)
Thomas Tempelmann
23

Pada OS Windows buat file dan berikan karakter yang tidak valid seperti \pada nama file. Akibatnya Anda akan mendapatkan popup dengan semua karakter yang tidak valid dalam nama file.

masukkan deskripsi gambar di sini

Devid
sumber
5

Lebih tepatnya tentang Mac OS X (sekarang disebut MacOS) /di Finder diinterpretasikan ke :dalam sistem file Unix.

Ini dilakukan untuk kompatibilitas mundur saat Apple pindah dari Classic Mac OS.

Adalah sah untuk menggunakan /dalam nama file di Finder, melihat file yang sama di terminal itu akan muncul dengan :.

Dan cara kerjanya juga sebaliknya: Anda tidak dapat menggunakan a /di nama file dengan terminal, tetapi a :tidak masalah dan akan muncul sebagai a /di Finder.

Beberapa aplikasi mungkin lebih membatasi dan melarang kedua karakter untuk menghindari kebingungan atau karena mereka menyimpan logika dari Mac OS Klasik sebelumnya atau untuk kompatibilitas nama antar platform.

Jean Létourneau
sumber
0

Untuk nama file "bahasa Inggris", ini berfungsi dengan baik. Saya menggunakan ini untuk membersihkan nama file yang diunggah. Nama file tidak dimaksudkan untuk ditautkan ke apa pun di disk, itu untuk saat file sedang diunduh maka tidak ada pemeriksaan jalur.

$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);

Pada dasarnya ini menghapus semua karakter yang tidak dapat dicetak dan dicadangkan untuk Windows dan OS lainnya. Anda dapat dengan mudah memperluas pola untuk mendukung lokal dan fungsi lain.

TheRealChx101
sumber
-1

Berikut adalah kode untuk membersihkan nama file di python.

import unicodedata

def clean_name(name, replace_space_with=None):
    """
    Remove invalid file name chars from the specified name

    :param name: the file name
    :param replace_space_with: if not none replace space with this string
    :return: a valid name for Win/Mac/Linux
    """

    # ref: https://en.wikipedia.org/wiki/Filename
    # ref: /programming/4814040/allowed-characters-in-filename
    # No control chars, no: /, \, ?, %, *, :, |, ", <, >

    # remove control chars
    name = ''.join(ch for ch in name if unicodedata.category(ch)[0] != 'C')

    cleaned_name = re.sub(r'[/\\?%*:|"<>]', '', name)
    if replace_space_with is not None:
        return cleaned_name.replace(' ', replace_space_with)
    return cleaned_name
Du D.
sumber
2
Kode tidak memeriksa nama yang tidak valid (dicadangkan), dan juga tidak memeriksa karakter yang tidak valid di replace_space_with. Panjang nama file berada di luar cakupan. Jadi, :return: a valid name for Win/Mac/Linuxtidak benar dalam semua keadaan.
ack