Winapi 使用GetFileAttributes(szPath)和GetLastError()检查文件

Winapi 使用GetFileAttributes(szPath)和GetLastError()检查文件,winapi,casting,getlasterror,Winapi,Casting,Getlasterror,这是一个后续的“ 我通过GetLastError()扩展了我的方法 我将DWORD转换为无符号整数,并尝试用MessageBox显示它 代码确实有效,但我无法从GetLastError()中可视化DWORD dw或Unsigned int test的值方法 这是一个win32项目,我试图构建一个方法来查看硬盘上是否存在文件 有超过15000个错误代码,不可能全部硬编码。 你的根本问题是你的石膏不正确。当编译器告诉您传递的参数的类型错误时,正确的方法是找到一种传递正确类型的参数的方法。相反,您可

这是一个后续的“

我通过
GetLastError()扩展了我的方法

我将DWORD转换为无符号整数,并尝试用MessageBox显示它

代码确实有效,但我无法从
GetLastError()中可视化
DWORD dw
Unsigned int test
的值方法

这是一个win32项目,我试图构建一个方法来查看硬盘上是否存在文件

有超过15000个错误代码,不可能全部硬编码。


你的根本问题是你的石膏不正确。当编译器告诉您传递的参数的类型错误时,正确的方法是找到一种传递正确类型的参数的方法。相反,您可以对编译器简单地说:“我比您更清楚,请忽略变量的类型,并假装它是我所说的。”

因此,与其写作

(LPCWSTR)test
您需要将整数
test
转换为以null结尾的宽字符串。有很多方法可以做到这一点。例如,您可以使用字符串流:

std::wstringstream sstream;
sstream << test;
std::wstring str = test.str();

您错误地解释了
GetFileAttributes
返回的值。这些是位标志的组合。换句话说,可以设置多个文件属性标志。您需要使用位and运算符,
&
来测试标志的存在


错误检查也会出错。文件说:

如果函数失败,则返回值为无效的\u文件\u属性。要获取扩展错误信息,请调用GetLastError

换句话说,只有当
GetFileAttributes
返回
无效的文件属性值时,才应该调用
GetLastError
。这是一个极其常见的错误,即认为错误由返回非零值的
GetLastError
指示。您必须阅读每个API函数的文档,以明确它是如何发出错误信号的



最后,如果您成功获取了有效的Win32错误代码,请使用
FormatMessage
获取错误的文本描述。

您不能将
DWORD
类型转换为字符串。你必须格式化它

你的错误检查是错误的

如果成功,
GetFileAttributes()
可以(并且经常)一次返回多个属性,但您无法处理这种可能性。您正在检查的一些值甚至不是一开始就有的值属性

请尝试以下方法:

BOOL FileExists(LPCTSTR szPath)
{
    DWORD dwAttrib = GetFileAttributes(szPath);
    if (dwAttrib == INVALID_FILE_ATTRIBUTES)
    {
        DWORD dw = GetLastError();
        switch (dw)
        {
            case ERROR_PATH_NOT_FOUND:
                MessageBoxW(NULL, L"ERROR_PATH_NOT_FOUND", L"File Error", MB_OK);
                break;

            case ERROR_FILE_NOT_FOUND:
                MessageBoxW(NULL, L"ERROR_FILE_NOT_FOUND", L"File Error", MB_OK);
                break;

            default:
            {
                std::wstringstream msg;
                msg << L"Error Code: " << dw;

                LPWSTR lpMsg = NULL;
                if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dw, 0, (LPWSTR)&lpMsg, 0, NULL))
                {
                    msg << std::endl << lpMsg;
                    LocalFree(lpMsg);
                }

                MessageBoxW(NULL, msg.str().c_str(), L"File Error", MB_OK);
                break;
            }
        }

        return false;
    }
    else
    {
        std::wstringstream attribs;

        if (dwAttrib & FILE_ATTRIBUTE_READONLY)
        {
            attribs << L"FILE_ATTRIBUTE_READONLY" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_READONLY;
        }

        if (dwAttrib & FILE_ATTRIBUTE_HIDDEN)
        {
            attribs << L"FILE_ATTRIBUTE_HIDDEN" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_HIDDEN;
        }

        if (dwAttrib & FILE_ATTRIBUTE_SYSTEM)
        {
            attribs << L"FILE_ATTRIBUTE_SYSTEM" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_SYSTEM;
        }

        if (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)
        {
            attribs << L"FILE_ATTRIBUTE_DIRECTORY" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_DIRECTORY;
        }

        if (dwAttrib & FILE_ATTRIBUTE_ARCHIVE)
        {
            attribs << L"FILE_ATTRIBUTE_ARCHIVE" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_ARCHIVE;
        }

        if (dwAttrib & FILE_ATTRIBUTE_DEVICE)
        {
            attribs << L"FILE_ATTRIBUTE_DEVICE" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_DEVICE;
        }

        if (dwAttrib & FILE_ATTRIBUTE_NORMAL)
        {
            attribs << L"FILE_ATTRIBUTE_NORMAL" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_NORMAL;
        }

        if (dwAttrib & FILE_ATTRIBUTE_TEMPORARY)
        {
            attribs << L"FILE_ATTRIBUTE_TEMPORARY" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_TEMPORARY;
        }

        if (dwAttrib & FILE_ATTRIBUTE_SPARSE_FILE)
        {
            attribs << L"FILE_ATTRIBUTE_SPARSE_FILE" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_SPARSE_FILE;
        }

        if (dwAttrib & FILE_ATTRIBUTE_REPARSE_POINT)
        {
            attribs << L"FILE_ATTRIBUTE_REPARSE_POINT" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_REPARSE_POINT;
        }

        if (dwAttrib & FILE_ATTRIBUTE_COMPRESSED)
        {
            attribs << L"FILE_ATTRIBUTE_COMPRESSED" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_COMPRESSED;
        }

        if (dwAttrib & FILE_ATTRIBUTE_OFFLINE)
        {
            attribs << L"FILE_ATTRIBUTE_OFFLINE" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_OFFLINE;
        }

        if (dwAttrib & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)
        {
            attribs << L"FILE_ATTRIBUTE_NOT_CONTENT_INDEXED" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_NOT_CONTENT_INDEXED;
        }

        if (dwAttrib & FILE_ATTRIBUTE_ENCRYPTED)
        {
            attribs << L"FILE_ATTRIBUTE_ENCRYPTED" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_ENCRYPTED;
        }

        if (dwAttrib & FILE_ATTRIBUTE_VIRTUAL)
        {
            attribs << L"FILE_ATTRIBUTE_VIRTUAL" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_VIRTUAL;
        }

        if (dwAttrib != 0)
            attribs << L"Other: " << std::hex << std::showbase << std::setw(8) << std::setfill(L'0') << dwAttribs << std::endl;

        MessageBoxW(NULL, attribs.str().c_str(), L"File Attributes", MB_OK);

        return true;
    }
BOOL文件存在(LPCTSTR szPath)
{
DWORD dwAttrib=GetFileAttributes(szPath);
if(dwAttrib==无效的文件属性)
{
DWORD dw=GetLastError();
交换机(dw)
{
案例错误\u未找到路径\u:
MessageBoxW(NULL,L“错误路径未找到”,L“文件错误”,MB\U OK);
打破
案例错误\u未找到文件\u:
MessageBoxW(NULL,L“错误文件未找到”,L“文件错误”,MB\U OK);
打破
违约:
{
std::wstringstream msg;

msg.此外,您应该了解基本知识。从中获取任何介绍。它不是未定义的行为。它是已定义的行为。临时对象在超出范围之前不会被销毁,在整个完整表达式完成之前也不会超出范围。在这种情况下,直到
MessageBoxW()
已被调用并退出。这不是该方法的最终版本,我只是想知道如何可视化这些值。但我确实考虑了您对多个属性的建议。您建议一段时间后再做一段时间?扫描多个?谢谢,在添加相应的头文件后,它起到了作用并清除了很多东西,这是再次执行nks。您正在编写文件存在检查器。与该逻辑相关的唯一标志是
文件属性\u目录
。其余检查器逻辑依赖于
GetLastError()如果你想显示文件的属性,你应该为此编写一个单独的函数。你的答案是非常翔实的,我在1、5年前在沙发上启动了C++。我试图从“代码> GETFILIVER属性< /代码>中了解所有的信息。由于找不到bmp文件,请尝试堵塞。谢谢!
std::wstring str = std::to_wstring();
BOOL FileExists(LPCTSTR szPath)
{
    DWORD dwAttrib = GetFileAttributes(szPath);
    if (dwAttrib == INVALID_FILE_ATTRIBUTES)
    {
        DWORD dw = GetLastError();
        switch (dw)
        {
            case ERROR_PATH_NOT_FOUND:
                MessageBoxW(NULL, L"ERROR_PATH_NOT_FOUND", L"File Error", MB_OK);
                break;

            case ERROR_FILE_NOT_FOUND:
                MessageBoxW(NULL, L"ERROR_FILE_NOT_FOUND", L"File Error", MB_OK);
                break;

            default:
            {
                std::wstringstream msg;
                msg << L"Error Code: " << dw;

                LPWSTR lpMsg = NULL;
                if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dw, 0, (LPWSTR)&lpMsg, 0, NULL))
                {
                    msg << std::endl << lpMsg;
                    LocalFree(lpMsg);
                }

                MessageBoxW(NULL, msg.str().c_str(), L"File Error", MB_OK);
                break;
            }
        }

        return false;
    }
    else
    {
        std::wstringstream attribs;

        if (dwAttrib & FILE_ATTRIBUTE_READONLY)
        {
            attribs << L"FILE_ATTRIBUTE_READONLY" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_READONLY;
        }

        if (dwAttrib & FILE_ATTRIBUTE_HIDDEN)
        {
            attribs << L"FILE_ATTRIBUTE_HIDDEN" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_HIDDEN;
        }

        if (dwAttrib & FILE_ATTRIBUTE_SYSTEM)
        {
            attribs << L"FILE_ATTRIBUTE_SYSTEM" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_SYSTEM;
        }

        if (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)
        {
            attribs << L"FILE_ATTRIBUTE_DIRECTORY" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_DIRECTORY;
        }

        if (dwAttrib & FILE_ATTRIBUTE_ARCHIVE)
        {
            attribs << L"FILE_ATTRIBUTE_ARCHIVE" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_ARCHIVE;
        }

        if (dwAttrib & FILE_ATTRIBUTE_DEVICE)
        {
            attribs << L"FILE_ATTRIBUTE_DEVICE" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_DEVICE;
        }

        if (dwAttrib & FILE_ATTRIBUTE_NORMAL)
        {
            attribs << L"FILE_ATTRIBUTE_NORMAL" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_NORMAL;
        }

        if (dwAttrib & FILE_ATTRIBUTE_TEMPORARY)
        {
            attribs << L"FILE_ATTRIBUTE_TEMPORARY" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_TEMPORARY;
        }

        if (dwAttrib & FILE_ATTRIBUTE_SPARSE_FILE)
        {
            attribs << L"FILE_ATTRIBUTE_SPARSE_FILE" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_SPARSE_FILE;
        }

        if (dwAttrib & FILE_ATTRIBUTE_REPARSE_POINT)
        {
            attribs << L"FILE_ATTRIBUTE_REPARSE_POINT" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_REPARSE_POINT;
        }

        if (dwAttrib & FILE_ATTRIBUTE_COMPRESSED)
        {
            attribs << L"FILE_ATTRIBUTE_COMPRESSED" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_COMPRESSED;
        }

        if (dwAttrib & FILE_ATTRIBUTE_OFFLINE)
        {
            attribs << L"FILE_ATTRIBUTE_OFFLINE" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_OFFLINE;
        }

        if (dwAttrib & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)
        {
            attribs << L"FILE_ATTRIBUTE_NOT_CONTENT_INDEXED" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_NOT_CONTENT_INDEXED;
        }

        if (dwAttrib & FILE_ATTRIBUTE_ENCRYPTED)
        {
            attribs << L"FILE_ATTRIBUTE_ENCRYPTED" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_ENCRYPTED;
        }

        if (dwAttrib & FILE_ATTRIBUTE_VIRTUAL)
        {
            attribs << L"FILE_ATTRIBUTE_VIRTUAL" << std::endl;
            dwAttrib &= ~FILE_ATTRIBUTE_VIRTUAL;
        }

        if (dwAttrib != 0)
            attribs << L"Other: " << std::hex << std::showbase << std::setw(8) << std::setfill(L'0') << dwAttribs << std::endl;

        MessageBoxW(NULL, attribs.str().c_str(), L"File Attributes", MB_OK);

        return true;
    }