2013-06-03 22 views
6

デルファイ:255文字以上のパスを再帰してファイルの属性を読み取る方法255文字以上のパスを再帰的に読み込み、ファイルの属性を読み取る方法は?

私はコンソールアプリケーションを作成しており、255文字を超えるパスを持つディレクトリ構造をトラバースし、その中のファイルの属性を読み取る必要があります。

歴史的に、2006年からTurbo Delphiを使用して再帰とFindFirstを使用しましたが、これは255文字を超えるパスをスキップするようです。

FindFirst()関数を別のものに置き換えることはできますか?または私は別のアプローチをとらなければならないのですか?

+1

これは、属性の代わりに 'FileExists'を要求する点を除いて、[Delphi - 255文字を超えるファイルが存在するかどうかをチェックする方法](http://stackoverflow.com/q/16874118/62576)の複製です。 。基本的な質問とその答えは同じです。 –

+0

@KenWhiteこの質問は本当に属性に関する質問ではありません。それらは 'WIN32_FIND_DATAW'構造体から読み込まれます。問題は、260文字の制限から解放する必要がある 'FindFirstFile'への呼び出しだけです。 –

+1

@David: '名前付けファイル 'リンクやA/Wバージョンの言及など、前の質問に対するあなたの答えにもすべて含まれています。どのように違うのですか? –

答えて

8

ファイル名に接頭辞\\?\を付けると、拡張長パス解析が有効になり、260文字のパス長の制限からエスケープされます。

このプレフィックスを機能させるには、Win32 API関数のUnicodeバージョンを呼び出す必要があります。したがって、Unicode Delphiを使用していた場合、これだけで必要です。しかし、Unicode以前のDelphiを使用しているので、独自のバージョンのFindFirstをロールバックして、UnicodeバージョンのAPI関数を呼び出す必要があります。 FindFirstFileWFindNextFileWFindClose、Unicode版の構造体WIN32_FIND_DATAWを使用します。

これらの問題については、MSDNのNaming Files, Paths, and Namespacesを参照してください。あなたの特定のシナリオで

FindFirstFileWのドキュメントは、このような問題を呼び出します。この関数のANSI版で

、名前がMAX_PATH文字に制限されています。この制限を32,767ワイド文字に拡張するには、関数のUnicodeバージョンを呼び出して、パスに "\?\"を追加します。

WIN32_FIND_DATAWの2つのファイル名フィールドの長さは260文字に制限されています。それは名前の相対部分だけを含んでいるので、それはうまくいきます。これは、オブジェクトを含むディレクトリに関連するオブジェクト名です。 FindFirstFileWに電話するときは、接頭辞\\?\を使用する必要があります。あなたがFindFirstFileWlpFileNameパラメータに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にすることだけです。それ以外のものは全く正常に流れます。

+0

私はこれを読んで、以前のバージョンのDelphiの関数をUnicode関数の回りにラップするか、より新しい "Unicode"バージョンを使うかの問題です。私が後者を行い、ちょうど再コンパイルしてもうまくいくでしょうか? – Tal

+0

Unicode Delphiで再コンパイルし、マジックプレフィックスを追加すると、探している結果が得られます。これは 'FindFirst'が' Path'パラメータを 'FindFirstFile'に渡し、UnicodeバージョンをUnicode Delphiで取得するためです。 –

関連する問題