Linuxでは/が違法であり、Windowsでは以下が違法であることを知っています(私は思う)*
.
"
/
\
[
]
:
;
|
,
他に何が欠けていますか?
ただし、包括的なガイドと、2バイト文字を考慮したガイドが必要です。外部のリソースへのリンクは私には問題ありません。
禁止文字を含む可能性のある名前を使用して、ファイルシステム上にディレクトリを最初に作成する必要があるため、これらの文字をアンダースコアに置き換える予定です。次に、このディレクトリとそのコンテンツを(Javaを使用して)Zipファイルに書き込む必要があるため、Zipディレクトリの名前に関する追加のアドバイスをいただければ幸いです。
禁止されたファイル名の文字の「包括的なガイド」は、文字だけでなくファイル名も予約するため、Windowsでは機能しません。はい、*
"
?
などの文字は禁止されていますが、禁止されている有効な文字だけで構成される名前は無限にあります。たとえば、スペースとドットは有効なファイル名文字ですが、それらの文字だけで構成される名前は禁止されています。
Windowsは大文字と小文字を区別しないため、A
name__という名前のフォルダーが既に存在する場合は、a
name__という名前のフォルダーを作成することはできません。 PRN
name__やCON
name__、その他多くの、より悪い、一見許されている名前は予約されており、許可されていません。 Windowsにも長さの制限がいくつかあります。あるフォルダで有効なファイル名が別のフォルダに移動されると無効になることがあります。ファイルとフォルダの名前付け の規則 はMSDNにあります。
一般に、Windowsディレクトリ名を作成するためにユーザー生成テキストを使用することはできません。ユーザーに必要な名前を付けることを許可する場合は、A
name__、AB
name__、A2
などの安全な名前を作成し、ユーザーが生成した名前とその同等のパスをアプリケーションデータファイルに格納し、アプリケーションでパスマッピングを実行する。
ユーザーが生成したフォルダ名を絶対に許可する必要がある場合、それらが無効かどうかを判断する唯一の方法は、例外を捕捉してその名前が無効であると見なすことです。アクセスの拒否、オフラインドライブ、およびドライブの空き領域のためにスローされる例外は、無効な名前のためにスローされる可能性があるものと重複するため、それでも危険をはらんでいます。あなたは怪我の一つの大きな缶を開けています。
それを単純にして、最初に質問に答えましょう。
禁止印刷可能ASCII文字は、次のとおりです。
Linux/Unix:
/ (forward slash)
Windows:
< (less than)
> (greater than)
: (colon - sometimes works, but is actually NTFS Alternate Data Streams)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)
印刷不能文字
あなたのデータが印刷不可能な文字を許すような情報源から来たものであれば、チェックすることがもっとあります。
Linux/Unix:
0 (NULL byte)
Windows:
0-31 (ASCII control characters)
注:ファイル名に制御文字を含むファイルを作成することはLinux/Unixファイルシステムでは有効ですが、 ユーザーにとっては悪夢かもしれません。そのようなファイルを扱う 。
予約ファイル名
次のファイル名が予約されています。
Windows:
CON, PRN, AUX, NUL
COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
(単独でも、任意のファイル拡張子を持つものでも、例えばLPT1.txt
)。
その他の規則
Windows:
ファイル名はスペースまたはドットで終わることはできません。
ブラックリストの文字を作成する代わりに、ホワイトリストを使用できます。すべてのことを考慮すると、ファイル名またはディレクトリ名のコンテキストで意味のある文字の範囲はかなり短く、特別な命名要件がある場合を除き、ユーザーがASCIIテーブル.
ターゲットファイルシステムの予約名の問題は解決されませんが、ホワイトリストを使用すると、ソースでのリスクを軽減するのが簡単になります。
その精神では、これは安全と見なすことができる文字の範囲です。
そして、あなたが許可したい追加の安全なキャラクター。これを超えて、あなたはただスペースとドットに関していくつかの追加のルールを強制する必要があります。通常はこれで十分です。
これはすでに非常に複雑で無意味な名前を許可します。たとえば、これらの名前はこれらの規則で可能であり、Windows/Linuxでは有効なファイル名です。
A...........ext
B -.- .ext
本質的には、ホワイトリストに載っている文字が非常に少ない場合でも、実際に意味があるものを判断し、それに応じて名前を検証/調整する必要があります。私のアプリケーションの1つでは、上記と同じ規則を使いましたが、重複したドットとスペースを取り除きました。
まあ、研究目的のためだけなら、あなたの最善の策は ファイル名に関するこのウィキペディアのエントリを見ることです 。
ユーザ入力を検証し、それに基づいてファイル名を作成するための移植可能な関数を作成したい場合、簡単な答えはしないです。 Perlの File :: Spec のような移植性のあるモジュールを見て、そのような「単純な」タスクを達成するために必要なすべてのホップを垣間見てください。
Windowsに答えを教えてもらう簡単な方法は、エクスプローラでファイルの名前を変更して新しい名前に/を入力することです。 Windowsは、不正な文字のリストを知らせるメッセージボックスをポップアップします。
A filename cannot contain any of the following characters:
\ / : * ? " < > |
Windowsの場合はPowerShellを使って確認できます。
$PathInvalidChars = [System.IO.Path]::GetInvalidPathChars() #36 chars
UTF-8コードを表示するためにあなたは変換することができます
$enc = [system.Text.Encoding]::UTF8
$PathInvalidChars | foreach { $enc.GetBytes($_) }
$FileNameInvalidChars = [System.IO.Path]::GetInvalidFileNameChars() #41 chars
$FileOnlyInvalidChars = @(':', '*', '?', '\', '/') #5 chars - as a difference
2017/04/18現在、このトピックに対する回答の中に、文字やファイル名の単純なブラックリストまたはホワイトリストは明白ではありません - そして、多くの回答があります。
私が思い付くことができる最もよい提案は、彼が好むけれどもユーザにファイルに名前をつけさせることでした。アプリケーションがファイルを保存しようとするときにエラーハンドラを使用して例外をキャッチし、ファイル名が責任を負うものであると仮定し(明らかに保存パスも問題ないことを確認した後)、新しいファイル名の入力をユーザーに促します。最良の結果を得るには、このチェック手順をループ内に配置します。このループは、ユーザーが正しく実行するかあきらめるまで続きます。私のために最もよく働いた(少なくともVBAで)。
Windows 10(2019)では、次の文字を入力しようとするとエラーが発生します:
ファイル名に次の文字を含めることはできません。
\ / : * ? " < > |
唯一の違法なUnix文字は/
とNULL
かもしれませんが、コマンドラインの解釈については考慮する必要があります。
たとえば、UNIXでは1>&2
または2>&1
というファイル名を付けることは正当かもしれませんが、このようなファイル名はコマンドラインで使用すると誤って解釈される可能性があります。
同様に、ファイルに$PATH
という名前を付けることも可能ですが、コマンドラインからアクセスしようとすると、シェルは$PATH
をその変数値に変換します。
Windowsでインターネットショートカットを作成するとき、ファイル名を作成するために、マイナスに変換されるスラッシュを除いて不正な文字をスキップします。