オペレーティングシステムに応じて、ファイル名に使用できる文字のリストはどこにありますか?(Linuxでは、文字:
はファイル名で許可されていますが、Windowsでは許可されていません)
オペレーティングシステムに応じて、ファイル名に使用できる文字のリストはどこにありますか?(Linuxでは、文字:
はファイル名で許可されていますが、Windowsでは許可されていません)
回答:
ウィキペディアのファイル名ページから始める必要があります。適切なサイズのテーブル(ファイル名制限の比較)があり、非常に多くのファイルシステムの予約文字が一覧表示されています。
また、MS-DOS などで予約されているファイル名など、各ファイルシステムに関する他の情報も多数ありますCON
。私は私が私が短縮ときたら、それにかまれたという理由だけで、ファイルが含まれていることを言及const.h
するcon.h
と、コンパイラがハング理由を考え出す時間半を過ごしました。
DOS はデバイスの拡張機能を無視することcon.h
が判明したためcon
、これは入力コンソールとまったく同じでした(もちろん、コンパイラーは、ヘッダーファイルに入力するのを待つので、続行しました)。
POSIX "Fully portable filenames"
はこれらをリストするエントリーを見ることです:A–Z a–z 0–9 . _ -
OK、メインプレーヤーのファイルシステムのみに関心がある場合は、ファイルシステムの比較を見てください。
NUL
、\
、/
、:
、*
、"
、<
、>
、|
。また、開始または終了にスペース文字、終了にピリオドはありません。:
または以外の有効なUnicode/
NUL
または以外の任意のバイト/
以外のすべてのバイトをしてNUL
、\
、/
、:
、*
、"
、<
、>
、|
とあなたは、ファイル/フォルダを持つことはできませんが呼び出さない.
か..
と(もちろん)何の制御文字。
/
。Windowsでは、バックスラッシュと一部の文字列(例:)は許可されていませんCON
。
:
、名前にsを含むファイルを作成できます。
/
FinderでのMac OS X(現在はMacOSと呼ばれます)の詳細について:
は、Unixファイルシステムで解釈されます。
これは、AppleがClassic Mac OSから移行したときの下位互換性のために行われました。
/
Finderでファイル名にa を使用して、ターミナルで同じファイルを表示すると、それがで表示されます:
。
あなたが使用することはできません。そして、それはあまりにも他の方法で回避します/
ターミナルでファイル名ではなく、:
OKであり、以下のように表示されます/
ファインダーインチ
一部のアプリケーションは、より制限的で、混乱を避けるため、または以前のクラシックMac OSからのロジックを保持したり、プラットフォーム間の名前の互換性のために両方の文字を禁止したりする場合があります。
「英語ロケール」ファイル名の場合、これはうまく機能します。アップロードしたファイル名のサニタイズにこれを使用しています。ファイル名は、ディスク上の何かにリンクされることを意図したものではありません。ファイルがダウンロードされているときのためのものであり、パスのチェックはありません。
$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);
基本的には、Windowsおよびその他のOSのすべての印刷不可および予約済み文字を削除します。パターンを簡単に拡張して、他のロケールや機能をサポートできます。
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
:return: a valid name for Win/Mac/Linux
すべての状況に当てはまるわけではありません。