1

我得到了以下代码:

int _tmain(int argc, _TCHAR* argv[]) {
    _finddata_t dirEntry;
    intptr_t dirHandle;
    dirHandle = _findfirst("C:/*", &dirEntry);
    int res = (int)dirHandle;
    while(res != -1) {
        cout << dirEntry.name << endl;
        res = _findnext(dirHandle, &dirEntry);
    }
    _findclose(dirHandle);
    cin.get();
   return (0);
}

这样做是打印给定目录 (C:) 包含的所有内容的名称。现在我必须打印出子目录中所有内容的名称(如果有的话)。到目前为止我有这个:

int _tmain(int argc, _TCHAR* argv[]) {
    _finddata_t dirEntry;
    intptr_t dirHandle;
    dirHandle = _findfirst(argv[1], &dirEntry);
    vector<string> dirArray;
    int res = (int)dirHandle;
    unsigned int attribT;
    while (res != -1) {
        cout << dirEntry.name << endl;
        res = _findnext(dirHandle, &dirEntry);
        attribT = (dirEntry.attrib >> 4) & 1; //put the fifth bit into a temporary variable
//the fifth bit of attrib says if the current object that the _finddata instance contains is a folder.
        if (attribT) { //if it is indeed a folder, continue (has been tested and confirmed already)
            dirArray.push_back(dirEntry.name);
            cout << "Pass" << endl;
            //res = _findfirst(dirEntry.name, &dirEntry); //needs to get a variable which is the dirEntry.name combined with the directory specified in argv[1].
    }
}
_findclose(dirHandle);
std::cin.get();
return (0);

}

现在我不是要求整个解决方案(我希望能够自己完成),但只有一件事我无法理解,那就是 TCHAR* argv。我知道 argv[1] 包含我在“命令参数”下的项目属性中放置的内容,现在它包含我想要在 (C:/users/name/New folder/*) 中测试我的应用程序的目录,其中包含一些带有子文件夹的文件夹和一些随机文件。argv[1] 当前给出以下错误:

错误:“_TCHAR*”类型的参数与“const char *”类型的参数不兼容

现在我搜索了 TCHAR,我知道它是 wchar_t* 或 char*,具体取决于使用 Unicode 字符集或多字节字符集(我目前使用的是 Unicode)。我也明白转换是一个巨大的痛苦。所以我要问的是:我怎样才能最好地使用 _TCHAR 和 _findfirst 参数解决这个问题?

我打算将 dirEntry.name 连接到 argv[1] 以及最后连接一个“*”,并在另一个 _findfirst 中使用它。由于我仍在学习 C++,因此对我的代码的任何评论都将受到赞赏。

4

2 回答 2

2

请参见此处:_findfirst用于多字节字符串,而_wfindfirst用于宽字符。如果您在代码中使用 TCHAR,则使用_tfindfirst(macro) 它将在非 UNICODE 上解析为 _findfirst,在 UNICODE 构建上解析为 _wfindfirst。

也可以使用 _tfinddata_t 代替 _finddata_t,这也将根据 UNICODE 配置解析为正确的结构。

另一件事是您也应该使用正确的文字,_T("C:/*")L"C:/*"在 UNICODE 构建上,"C:/*"否则。如果您知道您正在使用定义的 UNICODE 进行构建,请使用std::vector<std::wstring>.

顺便提一句。默认情况下,Visual Studio 将使用 UNICODE 创建项目,您只能使用广泛版本的函数_wfindfirst,因为没有充分的理由构建非 UNICODE 项目。

TCHAR 我知道它是 wchar_t* 还是 char* 取决于使用 UTF-8 字符集或多字节字符集(我目前使用的是 UTF-8)。

这是错误的,在 UNICODE windows apis 中使用 UTF-16。sizeof(wchar_t)==2.

于 2016-04-28T16:54:41.393 回答
1

使用这个简单的typedef

typedef std::basic_string<TCHAR> TCharString;

然后TCharString在任何你使用的地方使用std::string,比如这里:

vector<TCharString> dirArray;

有关std::basic_string的信息,请参见此处。

于 2016-04-28T16:51:28.903 回答