ファイルのパスの最大有効長が何であるかを理解しようとしています。
このため、Windows 7 のデフォルトの Windows ファイル マネージャーと次の PowerShell スクリプトを使用します。
Get-ChildItem | Select Name, FullName, @{N="Path Length";E={$_.FullName.Length}} | Format-List
abc.txt
マネージャーを開いて、にファイルを作成しC:\
、abc
ファイル マネージャーで許可されている限り に文字を追加します。(実際には、もちろんコピー アンド ペーストを使用します。この方がはるかに高速です。)
C:\aaa
次に、とで同じテストを実行しますC:\aaa\bbb
。
何らかの理由で、結果が異なります。C:\aaa
との最大長はC:\aaa\bbb
259 文字ですが、 の最大長はC:\
258 文字です。なぜでしょうか?
C:\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefgh.txt
258 characters
C:\aaa\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcde.txt
259 characters
C:\aaa\bbb\abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_a.txt
259 characters
アップデート
mail-archive.com の Python リストから:
(メールアーカイブ[メールアドレス]/メッセージ444514.html)
従来の DOS パスの長さ制限 (コンテキストに応じて 247、258、または 259 文字など)。
以下の説明は私によるものです。
247はディレクトリのパスの最大長を表します: 260 - 12 - 1 = 247。ここで、12は8.3ファイル名を表し、1はNULターミネータを表します。たとえば、C:\foo
またはC:\foo\bar
259はパスの最大長を表しますファイル(ディレクトリではない) 位置したないドライブのルートにあります。たとえば、C:\foo\aaa.txt
258はパスの最大長を表しますファイル(ディレクトリではない) 位置したでドライブのルート。たとえば、C:\aaa.txt
つまり、実際には 247、258、259 の 3 つの制限があります。
しかし、なぜドライブのルートにあるファイルには 258 の制限があり、他のディレクトリにあるファイルには 259 の制限があるのでしょうか?
参照:メールアーカイブ[メールアドレス]/メッセージ106171.html
MAX_PATH は、ファイル パスをわずか 259 文字 (末尾の null を除く) に制限し、現在のディレクトリを 258 文字 (末尾のバックスラッシュと null を除く) に制限し、新しいディレクトリのパスを 247 文字 (8.3 ファイル名用のスペースを残すため、259 から 12 を減算) に制限します。
しかし、2 番目の引用は私には意味がわかりません。この人がなぜ末尾のバックスラッシュについて話しているのか理解できません。末尾のバックスラッシュはディレクトリについて話しているときには当てはまるかもしれませんが、ファイルについては当てはまりません。
答え1
この違いについては簡単に説明できます。Windows 7 のコードが不良で、Windows 10 で新たに書き直されたのです。以下に、なぜそう考えるのか、また Windows 7 と 10 の両方におけるファイル名の長さに関するルールについて説明します。
しかし、まずはちょっとした注意点です。 MAX_PATH は、かなり以前のWindowsバージョンの遺物です。Windows APIは、データ構造でこれを頻繁に使用しているため、変更することはできません。たとえば、 WIN32_FIND_DATA、APIでこれを増やすと、既存のアプリケーションでメモリオーバーランが発生します。そのため、長いファイル名は、 レジストリ プログラムはマニフェストで長い名前を処理できることを宣言する必要があります。
また、ドライブ文字 ( C:\
) はテキストにのみ含まれており、Windows ディスク テーブル (MFT) とは関係がないことに留意してください。Windows は、ファイルがどのディスクに存在するかをよく認識しています。
以下は Windows 7 での私のテスト結果です。私の結果は投稿者の結果を裏付けています。
以下のルールを導き出すことができます。
- ドライブ文字は制限の計算には含まれません(
C:
) - 先頭のバックスラッシュは限界計算には含まれません(
C:\
) - 残りは256文字に制限され、これには中間のバックスラッシュが含まれます。
- ルート ファイルには最大 255 文字まで入力できますが、フォルダー内のファイルにはこれができません。
これらの無意味な結果は、コードが不適切に記述されていることを強く示唆しています。
まず、MFT に関する限り、各パス コンポーネントは独立しており、他のコンポーネント (サブフォルダー) とまったく同じ長さの制限があるため、ファイルが何らかのフォルダーに含まれているという理由だけで、ディスク テーブルにファイル名の長さを制限する固有の理由はありません。
次に、ルート ファイルはパス内の唯一の要素であるため (256 文字まで指定できることがわかりました)、256 文字に制限されているように見えるのに、なぜルート ファイルは 255 文字に制限されているのかという疑問があります。
説明を求めて、私は 255 が Microsoft によって決定されたファイル名の実際の制限であり、残りは実際には不適切に記述されたコードにすぎないという理論を立てました。
この理論を検証するために、Windows 10 の動作をテストしました。以下で同じ操作を繰り返しました (書き込みには管理者権限が必要ですC:\
)。
上記のように、ここでの動作ははるかに論理的です。パスの中間コンポーネントは、ファイル名のサイズを制限するためにカウントされなくなり、常に 255 文字になります。
255 文字のファイル名を許可することが Microsoft の当初の意図であったことは明らかですが、Windows 7 ではパスを考慮したコードによって、特に理由もなくこれが無効にされていました。
さらに調べてみると、NTFSのドキュメントが見つかりました。 属性 - $FILE_NAME (0x30)は、ファイル名の長さを1バイト指定します(オフセット0x40)。これは、255文字の制限をよく説明しています。(FireEyeも参照してください。 パート 2: ファイル名属性の内部構造)。
ちょっとした逸話: Microsoft のバグ保存の法則によると、Windows 10 エクスプローラーは、、およびにある 255 文字のファイルを削除できませんでした。C:\
それらを削除するには、コマンド プロンプトにコマンドを入力する必要がありました。(1 つのバグを修正すると、別のバグが発生します...)C:\Temp
C:\Temp\abc
del 12*
答え2
何らかの理由で、結果が異なります。C:\aaa と C:\aaa\bbb の最大長は 259 文字ですが、C:\ の最大長は 258 文字です。なぜでしょうか?
ご質問の点は、Windows エクスプローラーで通常許可されるパスの最大長はどれくらいかということだと思います。 260文字です。
これにより、パスに 248 文字、ファイル名に 12 文字を使用できるようになります。
サンプル ファイルの名前は、ヌル文字のために異なります。
Windows 10 バージョン 1607 より前の Windows エディションでは、パスの最大長は MAX_PATH で、260 文字と定義されています。それ以降のバージョンの Windows では、制限を解除するには、レジストリ キーを変更するか、グループ ポリシー ツールを使用する必要があります。
Windows API では (次の段落で説明するいくつかの例外を除く)、パスの最大長は MAX_PATH で、260 文字と定義されています。ローカル パスは、ドライブ文字、コロン、バックスラッシュ、バックスラッシュで区切られた名前コンポーネント、および終端のヌル文字の順序で構成します。たとえば、ドライブ D の最大パスは "D:\some 256-character path string" です。ここで、"" は現在のシステム コード ページの非表示の終端のヌル文字を表します。(文字 < > はここでは視覚的にわかりやすくするために使用されており、有効なパス文字列の一部にすることはできません。)
ソース:
答え3
考慮すべき制限は2つあります。1つはパスの最大長、もう1つはファイル名の最大長です。NTFSでは、ファイル名には最大255個のUTF-16コードポイントを含めることができます、ヌルバイトなし(12ページを参照)。
abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefghijklmnopqrstuvwxyz_abcdefgh.txt
長さはちょうど 255 文字です。