2

我正在尝试使用此示例 创建一个程序,该程序将列出Windows::Forms::ListBox.

由于用户不会进行任何输入,因此我不需要该 void DisplayErrorBox(LPTSTR lpszFunction)功能以及其他错误检查。

当我单击触发事件的按钮时,这就是列表框中显示的内容。

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

此外,每次单击按钮时只会出现一行。它应该找到目录中的所有文件并列出它们,而不是每次单击按钮时都找到下一个文件。

我也想使用相对的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

演员阵容(TCHAR*)strPath.c_str();错了。从您的使用中WideCharToMultiByte我知道这(TCHAR*)strPath.c_str();是将 achar const* 转换为wchar_t*. 这不仅会丢失 a const,而且宽度也是错误的。

于 2012-07-06T13:11:26.453 回答
0

如果您使用的是 Visual Studio,则将配置设置更改为Use Multibyte Character set. 这将使您的 TCHAR 东西无需任何转换即可编译。

于 2014-01-20T13:39:38.427 回答