0

我正在尝试查找具有特定名称的文件并在 C++ 中删除它们,因为如果我将直接桌面路径提供给它 L"path//",则此代码可以正常工作,但是由于不同的用户和系统,桌面的路径不同所以我是什么我在顶部做的是在字符串变量中获取桌面路径并分配它而不是直接路径。

string desk=getenv("DESKTOP");


        WIN32_FIND_DATAW fd;
        HANDLE hFind = FindFirstFileW(desk, &fd);
        if (hFind != INVALID_HANDLE_VALUE)
        {
            do
            {
                DeleteFileW((wstring(desk) + fd.cFileName).c_str());
            } while (FindNextFileW(hFind, &fd));
            FindClose(hFind);
        }

我收到以下错误

错误 4 错误 C2664:“FindFirstFileW”:无法将参数 1 从“std::string”转换为“LPCWSTR”

我已经尝试过使用 wstring 和 wchar 但它再次给出错误。谁能帮我解决这个问题。在代码中寻找更正

4

2 回答 2

0

Windows 通常有两个版本的函数,一个 A 后缀通常是它接受字符,一个 W 后缀接受一个 wchar_t,并且没有后缀通常最终作为选择任何字符集的宏。通常,它们将接受的字符串类型是 LPCWSTR(指向宽常量字符串的长指针)或 LPCSTR(指向常量字符串的长指针)。

FindFirstFileW() 的第一个参数采用 LPCWSTR。

LPCWSTR 是 const wchar_t* 的类型定义。您正在传递一个 std::string,所以它是错误的类型。

只要与字符串类型保持一致,要么这样做:

wstring desk = _wgetenv(L"DESKTOP");

string findDigitsInBinary(int A) {

    WIN32_FIND_DATAW fd;

    HANDLE hFind = FindFirstFileW(desk.c_str(), &fd); // First argument takes LPCWSTR

或者:

string desk = getenv("DESKTOP");

string findDigitsInBinary(int A) {

    WIN32_FIND_DATAA fd;

    HANDLE hFind = FindFirstFileA(desk.c_str(), &fd); // First arg takes LPCSTR

请注意,在这两种情况下,您都传递了字符串类,而是传递了字符串保存的字符缓冲区。

后缀 W 和 AI 认为代表宽和 ANSI。

于 2018-03-13T03:35:06.433 回答
0

由于您直接调用 Win32 函数,因此一致性建议使用GetEnvironmentVariableW而不是getenv. 对变量的依赖DESKTOP已经是 Windows 特有的;这无论如何都不是可移植的代码。

于 2018-03-13T11:23:04.740 回答