0

C++ で Windows フォームを作成しました。ボタンをクリックすると、フォルダー選択用のダイアログ ボックスが開きます。

ここでやりたいことは、そのディレクトリ内のファイルのリストを取得して、それらを 1 つずつ処理できるようにすることです。

私は多くの方法でそれをグーグルで検索し、外部ライブラリ (boost や diren.h など) を含む多くの方法を見つけました。私は外部リソースを使用したくありませんが、自由に使えるもの、デフォルトのものを使用します。

FindFirstFile と FindNextFile について読んだことがありますが、その組み合わせを機能させることができませんでした。

助けていただけますか?

どうもありがとう、イダン。

更新されたコードは次のとおりです。

HANDLE hFind;
WIN32_FIND_DATA FindFileData;
FolderBrowserDialog^ folderBrowserDialog1 = gcnew FolderBrowserDialog;

if (folderBrowserDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
        String ^ selected = folderBrowserDialog1->SelectedPath;

        selected += "\\*";

        char* stringPointer = (char*) Marshal::StringToHGlobalAnsi(selected).ToPointer();

        hFind = FindFirstFile((LPCWSTR)stringPointer, &FindFileData);
        while(hFind != INVALID_HANDLE_VALUE)
        {
            printf("Found file: %s\r\n", FindFileData.cFileName);
            if(FindNextFile(hFind, &FindFileData) == FALSE)
                break;
        }
}
4

1 に答える 1

0

FindFirstFile の lpFileName パラメータの newStr をキャストする必要があるため、明らかに UNICODE (ワイド文字) 用にコンパイルします。ただし、ANSI 文字列を渡すため、有用な結果が得られない可能性があります。あなたは、あなたが期待するものを書きませんでした。

FindFirstFile の前のコードでは、SelectedPath 値を手動で ANSI char に変換します。とにかく広い文字列が必要な場合、それは意味がありません。StringToHGlobalUni メソッドで選択した文字列から LPCWSTR を取得します。これはどういうわけか次のようになります (テストされていません)。

LPCWSTR stringPointer = Marshal::StringToHGlobalAnsi(selected).ToPointer(); 

hFind = FindFirstFile(stringPointer, &FindFileData); 

一般的に: 悪い設計のインターフェースを適応させる必要がある場合を除いて、キャストを使用しないでください。自分が何をしているのかを正確に知っている場合にのみ使用してください。

さらに、FindFirstFile の hFind 結果をチェックしません。間違った文字列形式へのポインターを渡すと、INVALID_HANDLE_VALUE になります。

于 2012-07-16T12:50:08.210 に答える