Dosya adında izin verilen karakterler


139

İşletim sistemine bağlı olarak dosya adlarında izin verilen karakterlerin listesini nerede bulabilirim? (örneğin Linux'ta, :dosya adlarında karaktere izin verilir, ancak Windows'ta izin verilmez)


.NET, Windows için bu bilgileri sağlar.
Lepie


8
@kreker Sorunuzun Android hakkında olduğunu unutmayın
congusbongus


Yanıtlar:


107

Wikipedia Dosya Adı sayfasından başlamalısınız . Oldukça fazla dosya sistemi için ayrılmış karakterleri listeleyen düzgün bir tabloya ( Dosya adı sınırlamalarının karşılaştırılması ) sahiptir.

Ayrıca, MS-DOS altında ayrılmış dosya adları da dahil olmak üzere, her dosya sistemi hakkında başka bilgiler de içerir CON. Ben kısaltılmış zaman keresinde tarafından ısırıldı çünkü sadece bir dosya bulunmaktadır söz const.hetmek con.hve derleyici asılı neden bulmaktan yarım saat geçirdi.

DOS üzerinden Dönüşler göz ardı böylece cihazlar için uzantıları con.htam olarak aynıydı congiriş konsoluna, (tabii, yani beni etmek için, derleyici bekliyordu yazın o devam edeceğini önce başlık dosyası).


4
Wikipedia sayfasını biraz belirsiz ve kafa karıştırıcı buluyorum, örneğin "Bazı işletim sistemleri bazı karakterleri yasaklıyor ...". Aslında izin verilen ve izin verilmeyen tüm karakterleri listeleyen eksiksiz bir tablo arıyorum.
Python dude

7
@python, bu tabloya bakmayın, altındaki büyük şerefe bakın ("Dosya adı sınırlamalarının karşılaştırılması"). Budur değil içeriği o kadar belirsiz.
paxdiablo

52
Muhtemelen tek ihtiyacınız POSIX "Fully portable filenames"olan, aşağıdakileri listeleyen girişe bakmaktır :A–Z a–z 0–9 . _ -
Vladimir Kornea


1
@CpILL Sadece Windows, OSX ve Linux'tan daha fazla işletim sistemi var ... bazılarının çok basit dosya sistemleri var.
zarif zar

33

Tamam, şu an dosya sistemlerinin Karşılaştırma yalnızca ana oyuncular dosya sistemleri hakkında bakım:

böylece herhangi bir bayt hariç NUL, \, /, :, *, ", <, >, |ve dosyaları olamaz / klasörleri aramak .veya ..(elbette) ve hiçbir kontrol karakterleri.


7
Bu doğru değil. Linux izin vermiyor /. Windows ters eğik çizgiye ve bazı dizelere izin vermez (örn. CON).
kgadek

7
evet, bu yüzden hariç dedim .
CpILL

2
Mac'te (HFS + çalıştıran), :adlarında s olan dosyalar oluşturabiliyorum .
erwaman

Bu doğru değil. Windows'un izin vermediği diğer karakterler için bu yanıta bakın .
mbomb007

Windows da herhangi bir kontrol karakterine izin vermiyor (ancak Mac, NUL dışında)
Thomas Tempelmann

23

Windows işletim sisteminde bir dosya oluşturun ve dosya adındaki gibi geçersiz bir karakter verin \. Sonuç olarak, dosya adındaki tüm geçersiz karakterleri içeren bir açılır pencere görüntülenir.

resim açıklamasını buraya girin


5

/Finder'daki Mac OS X (şimdi MacOS olarak adlandırılır) hakkında daha kesin olmak gerekirse :, Unix dosya sisteminde yorumlanır.

Bu, Apple Klasik Mac OS'den taşındığında geriye dönük uyumluluk için yapıldı.

Bir kullanımı meşru /bir ile gösterilir terminalde aynı dosyanın bakarak Finder bir dosya adında :.

Ve başka bir şekilde de çalışır: /terminal ile bir dosya adında a kullanamazsınız , ancak a :tamamdır ve /Finder'da bir olarak görünecektir .

Bazı uygulamalar daha kısıtlayıcı olabilir ve karışıklığı önlemek veya önceki Klasik Mac OS'den mantık tutmaları veya platformlar arasındaki ad uyumluluğu nedeniyle her iki karakteri de yasaklayabilir.


0

"İngilizce yerel" dosya adları için bu iyi çalışır. Yüklenen dosya adlarını sterilize etmek için kullanıyorum. Dosya adı diskteki herhangi bir şeye bağlı değildir, dosya indirilirken yol kontrolü yoktur.

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

Temel olarak Windows ve diğer işletim sistemleri için yazdırılamayan ve ayrılmış tüm karakterleri ayırır. Şunları yapabilirsiniz kolayca diğer yerel ayarları ve işlevleri desteklemek için desen uzatın.


-1

Python'da dosya adını temizlemek için kod.

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

2
Kod geçersiz (ayrılmış) adları denetlemez ve replace_space_with öğesinde de geçersiz bir karakter olup olmadığını denetlemez. Dosya adının uzunluğu kapsamın dışında. Yani, :return: a valid name for Win/Mac/Linuxher koşulda doğru değildir.
ack
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.