【问题标题】:C++ System Time returning the same wrong valueC++ 系统时间返回相同的错误值
【发布时间】:2011-09-22 15:36:53
【问题描述】:

我想检索文件的最后写入日期。我已经为它编写了这段代码,但它总是以“年”之类的值返回 52428

int LastErrorCode;
LPCSTR Path = "C:/Users/Username/Desktop/Picture.PNG";
WIN32_FIND_DATA Information;

if(!FindFirstFile(Path, &Information))
{
    int LastErrorCode = GetLastError();
    cout << "FIND FIRST FILE FAILED" << endl;
    cout << LastErrorCode << endl;
}


SYSTEMTIME MyTime;
FILETIME MyFileTime = Information.ftLastWriteTime;


if(!FileTimeToSystemTime(&MyFileTime, &MyTime))
{
    LastErrorCode = GetLastError();
    cout << "FILE TIME TO SYSTEM TIME FAILED" << endl;
    cout << LastErrorCode << endl;
}


cout << MyTime.wYear << endl;

【问题讨论】:

    标签: c++ winapi systemtime


    【解决方案1】:

    52428的十六进制值是0xCCCC,这似乎表明它没有被初始化。函数调用可能失败。检查FindFirstFileFileTimeToSystemTime的返回码(查找错误码失败后再调用GetLastError)。

    编辑根据对 OP 的编辑,FindFirstFile 调用很可能是失败的调用。返回值是一个句柄(不是零/非零结果)。代码应将结果分配给HANDLE 类型的变量,然后与INVALID_HANDLE_VALUE 进行比较。

    还要注意,在成功调用FindFirstFile 后,代码应该有一个对FindClose 的对应调用,并带有句柄以避免资源泄漏。

    【讨论】:

    • 嘿。 FileTimeToSystemTime 失败,我得到错误代码 87,意思是“参数不正确。”。我不知道出了什么问题。 *我已经更新了答案中的代码
    • @Janman:我添加了更多信息。我怀疑您对 FindFirstFile 的调用失败(结果不是“布尔”类型)。
    【解决方案2】:

    请查看此函数的文档! 它告诉你以下内容:

    如果函数成功,则返回值非零。

    如果函数失败,返回值为零。要获取扩展的错误信息,请调用 GetLastError。

    尝试检查返回值是否为非零,如果不是,请尝试调用 getlasterror 并在控制台上打印该错误消息并提供此信息。

    【讨论】:

    • FileTimeToSystemTime() 失败,我得到错误代码 87,意思是“参数不正确。”。我不知道出了什么问题。 *我已经更新了答案中的代码
    • 我认为 Mark 发布了解决方案 :)
    【解决方案3】:

    过去,我使用的是 WIN32_FILE_ATTRIBUTE_DATA 而不是 WIN32_FIND_DATA。然后为了获取文件的信息,我使用 GetFileAttributesEx。下面是一个例子:

    string strFile = "c:\\myfile.txt";
    
    WIN32_FILE_ATTRIBUTE_DATA    fileInfo;
    // Get the attributes structure of the file
    if ( GetFileAttributesEx(strFile, 0, &fileInfo) )
    {
        SYSTEMTIME        stSystemTime;
        // Convert the last access time to SYSTEMTIME structure: 
        if ( FileTimeToSystemTime(&fileInfo.ftLastAccessTime, &stSystemTime) )
        {
            printf("Year = %d,  Month = %d,  Day = %d,  Hour = %d,  Minute = %d\n", stSystemTime.wYear, stSystemTime.wMonth, stSystemTime.wDay, stSystemTime.wHour, stSystemTime.wMinute);
        }
    

    【讨论】:

      【解决方案4】:

      您不应该在文件路径中使用反斜杠“\”吗?如果这会更正您的文件路径,FindFirstFile API 调用可能会成功,并会为您提供所需的时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-23
        • 1970-01-01
        • 2020-05-29
        • 1970-01-01
        • 2017-10-02
        • 1970-01-01
        • 1970-01-01
        • 2018-10-06
        相关资源
        最近更新 更多