ファイル名に接頭辞\\?\
を付けると、拡張長パス解析が有効になり、260文字のパス長の制限からエスケープされます。
このプレフィックスを機能させるには、Win32 API関数のUnicodeバージョンを呼び出す必要があります。したがって、Unicode Delphiを使用していた場合、これだけで必要です。しかし、Unicode以前のDelphiを使用しているので、独自のバージョンのFindFirst
をロールバックして、UnicodeバージョンのAPI関数を呼び出す必要があります。 FindFirstFileW
、FindNextFileW
、FindClose
、Unicode版の構造体WIN32_FIND_DATAW
を使用します。
これらの問題については、MSDNのNaming Files, Paths, and Namespacesを参照してください。あなたの特定のシナリオで
、FindFirstFileW
のドキュメントは、このような問題を呼び出します。この関数のANSI版で
、名前がMAX_PATH文字に制限されています。この制限を32,767ワイド文字に拡張するには、関数のUnicodeバージョンを呼び出して、パスに "\?\"を追加します。
WIN32_FIND_DATAW
の2つのファイル名フィールドの長さは260文字に制限されています。それは名前の相対部分だけを含んでいるので、それはうまくいきます。これは、オブジェクトを含むディレクトリに関連するオブジェクト名です。 FindFirstFileW
に電話するときは、接頭辞\\?\
を使用する必要があります。あなたがFindFirstFileW
のlpFileName
パラメータにWideString
を使用してPWideChar(FileName)
を使用してそれを渡します。このAPIのUnicodeバージョンを使用するためには
。ファイルの属性については
var
FileName: WideString;
....
// initialise FileName, this will happen in your recursion
FindHandle := FindFirstFileW(PWideChar(FileName), FindData);
、彼らはそれぞれの反復にWIN32_FIND_DATAW
構造体の読み出すことができます。コードのその部分は変更する必要はありません。修正する必要があるのは、最初の呼び出しで> 260文字の解析をFindFirstFileW
にすることだけです。それ以外のものは全く正常に流れます。
これは、属性の代わりに 'FileExists'を要求する点を除いて、[Delphi - 255文字を超えるファイルが存在するかどうかをチェックする方法](http://stackoverflow.com/q/16874118/62576)の複製です。 。基本的な質問とその答えは同じです。 –
@KenWhiteこの質問は本当に属性に関する質問ではありません。それらは 'WIN32_FIND_DATAW'構造体から読み込まれます。問題は、260文字の制限から解放する必要がある 'FindFirstFile'への呼び出しだけです。 –
@David: '名前付けファイル 'リンクやA/Wバージョンの言及など、前の質問に対するあなたの答えにもすべて含まれています。どのように違うのですか? –