22

C# を使用する場合、ディレクトリの一般的なパスに含めることができる最大文字数は?

たとえばC:\test\、長さが 7 文字の場合、最大の長さは?

4

2 に答える 2

43

CLR の MaxPath の最大値は 260 文字です

最大文字数はMAX_PATH、Win32 API ライブラリで定義されています。この設定は 260 で、同じ設定が CLR BCL 内でハードコーディングされて使用されます。その文字数に達するパスは、問題を引き起こす可能性があります (以下の脇を参照)。この最大値は、古き良き FAT および FAT32 の最大値です。

逆に、デフォルトで大部分の Windows インストールで使用される NTFS ファイルシステムは、最大 32767 文字で、Unicode をサポートします (各文字が 2 バイトを占める実装では、UTF-32 ではなく UCS-2)。ただし、NTFS でも、1 つのパス セグメントが 255 文字を超えてはなりません。NTFS は非常に長いファイル名をサポートしていますが、 に依存する .NET アプリケーションを含むほとんどのアプリケーションは、System.IOこれらのファイル名を認識できません。

なぜ 256 ではなく 260 なのですか? ドライブ指定子のため、最初のバックスラッシュと末尾のヌル終了文字は長さ制限の一部ではありません。を使用して、Windows のこの情報を取得できます。この情報はGetVolumeInformation、ボリュームごとに個別に照会する必要があります (各ボリュームの最大サイズは異なる場合があります)。

Windowsを想定しました。Linux やその他の OS は異なる場合があります。Windows 10 ビルド 1607 以降、この制限は削除されました。詳細については、以下を参照してください。


一般的なアドバイスとして、これらの数値に頼るべきではありません。代わりに、パスが長すぎることをユーザーに通知する場合は、PathTooLongException をキャッチします。

try
{
    SetCurrentDirectory(longPath);
}
catch(PathTooLongException exc)
{
    Console.WriteLine("The pathname was too long");
}

注: 上記のコードは、CLR が課している制限である 260 文字を超えるとスローされます。これは実際の制限ではありません (最初の段落を参照)。

余談ですが.NETについて

Microsoftは、CLR でサポートされている最大パス サイズを確実に確認できないことが、.NET の現在の実装に問題があることを確認しています。この情報をプログラムで取得する場合は、Path.MaxPathプロパティを使用します。ただし、このプロパティは、internalリフレクションを介してのみアクセスでき、バージョン間または他の BCL 実装 (Mono) で動作することを保証できないことを意味します。

// reflection
FieldInfo maxPathField = typeof(Path).GetField("MaxPath", 
    BindingFlags.Static | 
    BindingFlags.GetField | 
    BindingFlags.NonPublic );

// invoke the field gettor, which returns 260
int MaxPathLength = (int) maxPathField.GetValue(null);

注: これにより、Microsoft の .NET 実装で使用される最大パスが得られます。最大ディレクトリ サイズ Path.MAX_DIRECTORY_PATH の BCL には別の値がありますが、BCL 内でもこれは使用されません。このサイズのディレクトリを作成すると、そのディレクトリ内にファイルを配置できなくなります。さらに悪いことに、それを開くだけでエラーが発生します (必須のセミディレクトリ エイリアス...が原因で、多くの API がクラッシュします)。


更新: Windows 10 ビルド 1607の時点で、レジストリの OptIn を介して制限を削除できます。

Windows 10 バージョン 1607 以降では、一般的な Win32 ファイルおよびディレクトリ関数から MAX_PATH の制限が削除されました。ただし、新しい動作にオプトインする必要があります。

レジストリ キーを使用すると、新しい長いパスの動作を有効または無効にすることができます。長いパスの動作を有効にするには、レジストリ キーを HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (タイプ: REG_DWORD) に設定します。

詳細については、MSDN の更新されたエントリの「Maximum Path Length Limitation」というタイトルのセクションを参照してください。

于 2010-08-04T14:29:06.840 に答える
-1

パスの先頭に\\?. MSDNで次の名前付けファイル、パス、および名前空間を参照してください。

于 2010-08-04T14:39:04.040 に答える