2013-07-19 14 views
5

テストの目的で、Windows MAX_PATHの制限を超えるディレクトリをディスク上に作成したいと考えています。 どうすればいいですか?MAX_PATHを超えるディレクトリを作成する方法

(私はそれがブロックされていますcmdを、Windowsのエクスプローラ=>、PowerShellを試してみました。)

編集: ZetaLongPathsライブラリーからZlpIOHelperの使用は、標準のディレクトリクラスのに対し、恐ろしい例外をスローすることを行うことができます:

 static void Main(string[] args) 
    { 
     var path = @"d:\temp\"; 
     var dirName = "LooooooooooooooooooooooooooooooooooooooooooooongSubDirectory"; 
     while (path.Length <= 280) 
     { 
      path = Path.Combine(path, dirName); 
      ZlpIOHelper.CreateDirectory(path); //Directory.CreateDirectory(path); 
     } 
     Console.WriteLine(path); 
     Console.ReadLine(); 
    } 
+0

C#ではこのライブラリを試してください:http://zetalongpaths.codeplex.com/....それがWIN32にある場合、特別な接頭辞を使用して長いファイル名を使用する必要があります。 http://msdn.microsoft.com/en-us/library/aa365247.aspx –

+1

いくつかのAPIメソッドには、 "\\?\"を使用してUnicode呼び出しをlongのプレフィックスとして使用できるコメントがありますパスがありますが、それがコマンドラインツールに変換されるかどうかわかりません – Rup

答えて

12

WIN32でより長いファイル名を使用できるようにするには、特別な "\\?\"接頭辞を使用する必要があります。

参照:パス文字列へのファイルI/O、「\\?\」プレフィックスのhttp://msdn.microsoft.com/en-us/library/aa365247.aspx

は、すべての文字列解析を無効にすると 、それを次の文字列を送信するには、Windows APIを伝えますファイルシステムにまっすぐです。たとえば、ファイルシステム が大きなパスとファイル名をサポートする場合、Windows APIによって強制されるMAX_PATH の制限を超えることができます。 通常の最大パス制限に関する情報については、前の セクションの「最大パス長の制限」を参照してください。

このライブラリを使用すると、WIN32ファイルAPIへのすべてのPInvokesを実行し、パスにプレフィックスを追加する必要がなくなります。

1

どのようにこのようなものについて:

var path = "C:\\"; 
while (path.Length <= 260) 
{ 
    path = Path.Combine(path, "Another Sub Directory"); 
} 
+1

それは私に勝つ+1 – Sayse

+1

私は彼が "ディスク上に作成"を意味すると仮定しましたか? – Rup

+0

私のコメントからcreate dirを追加してください。そこには – Sayse

1

最も簡単な解決策は、ディレクトリc:\A\averylongnamethatgoesonandonandon...を作成 して、はるかに長いものにC:\Aの名前を変更することです。 Windowsは、Aのすべての子をチェックして、その子の名前がMAX_PATHを超えるかどうかを確認しません。

+1

既存のディレクトリの名前を短い名前に変更せずに、その後、名前を変更します。いいえ、良い解決策ではありません。また、 'A 'のファイルが使用されている場合、それを行うことはできません。 –

関連する問題