2

この例を使用 して、ディレクトリ内のすべてのファイル名をWindows::Forms::ListBox.

void DisplayErrorBox(LPTSTR lpszFunction)ユーザーは入力を行わないため、他のエラー チェックと一緒に関数を使用する必要はありません 。

イベントをトリガーするボタンをクリックすると、これがリスト ボックスに表示されます。

o //&#o/
/ //
/ //
/ //
/ //
/ //
/ //
/ //

また、ボタンをクリックするたびに1行しか表示されません。ボタンをクリックするたびに次のファイルを見つけるだけでなく、ディレクトリ内のすべてのファイルを検索して一覧表示することになっています。

また、絶対ではなく相対strPathを使用したい...これまでのところ、これは私がコードで行ったことです:

private:
    void List_Files()
    {
        std::string strPath =   "C:\\Users\\Andre\\Dropbox\\Programmering privat\\Diablo III DPS Calculator\\Debug\\SavedProfiles";     
        TCHAR* Path = (TCHAR*)strPath.c_str();

        WIN32_FIND_DATA ffd;
        LARGE_INTEGER filesize;
        TCHAR szDir[MAX_PATH];
        size_t length_of_arg;
        HANDLE hFind = INVALID_HANDLE_VALUE;

        // Prepare string for use with FindFile functions.  First, copy the
        // string to a buffer, then append '\*' to the directory name.

        StringCchCopy(szDir, MAX_PATH, Path);
        StringCchCat(szDir, MAX_PATH, TEXT("\\*"));

        // List all the files in the directory with some info about them.

        do
        {
          if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
          {
              //If it's a directory nothing should happen. Just continue with the next file.

          }
          else
          {
                //convert from wide char to narrow char array
                char ch[260];
                char DefChar = ' ';

                WideCharToMultiByte(CP_ACP,0,(ffd.cFileName),-1, ch,260,&DefChar, NULL);

                //A std:string  using the char* constructor.
                std::string str(ch);
                String ^ sysStr = gcnew String(str.c_str());

              MessageBox::Show("File Found", "NOTE");
              ListBoxSavedFiles->Items->Add (sysStr);

          }
        }
        while (FindNextFile(hFind, &ffd) != 0);

        FindClose(hFind);
    }
4

4 に答える 4

4

FindFirstFile()は呼び出されないため、呼び出す前に呼び出す必要がありますFindNextFile():

HANDLE hFind = FindFirstFile(TEXT("C:\\Users\\Andre\\Dropbox\\Programmering privat\\Diablo III DPS Calculator\\Debug\\SavedProfiles\\*"), &ffd);

if (INVALID_HANDLE_VALUE != hFind)
{
    do
    {
        //...

    } while(FindNextFile(hFind, &ffd) != 0);
    FindClose(hFind);
}
else
{
    // Report failure.
}
于 2012-07-06T13:11:23.960 に答える
1

Boostを使用してもかまわない場合は、 directory_iterator:を使用できます。

using boost::filesystem;

path p("some_dir");
for (directory_iterator it(p); it != directory_iterator(); ++it) {
    cout << it->path() << endl;
}

Windowsでも動作し、間違いなくはるかにシンプルに見えます。もちろん、現在のコードを少し調整する必要がありますが、長期的には努力する価値があると思います。

于 2012-07-06T13:23:15.680 に答える
0

Visual Studio を使用している場合は、構成設定を に変更しますUse Multibyte Character set。これにより、TCHAR がキャストなしでコンパイルされます。

于 2014-01-20T13:39:38.427 に答える
0

キャスト(TCHAR*)strPath.c_str();が間違っています。あなたの使用から、それが a を a にキャストしWideCharToMultiByteていることがわかります。を失うだけ でなく、幅も間違っています。(TCHAR*)strPath.c_str();char const*wchar_t*const

于 2012-07-06T13:11:26.453 に答える