2011-09-22 58 views
0

我想检索文件上的最后写入日期。我已经写了此代码,但它返回我在52428像值“年”的所有时间C++系统时间返回相同的错误值

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; 

回答

6

为52428的十六进制值是0xCCCC,这似乎表明它尚未初始化。函数调用可能失败。检查来自FindFirstFileFileTimeToSystemTime的返回码(然后在未能找到错误代码后调用GetLastError)。

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

还要注意,在成功拨打FindFirstFile后,代码应该与FindClose对应的呼叫,以避免资源泄漏。

+0

嘿。 FileTimeToSystemTime失败,我得到错误代码87,意思是“参数不正确。”。我不知道什么是错的。 *我已更新回答中的代码 – Janman

+0

@Janman:我添加了更多信息。我怀疑你对FindFirstFile的调用失败(结果不是“布尔”类型)。 –

5

请检查此功能的文档! 它告诉你以下内容:

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

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

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

+0

FileTimeToSystemTime()失败,我得到错误代码87,意思是“参数不正确。”。我不知道什么是错的。 *我已经更新了回答 – Janman

+0

中的代码,我认为Mark发布了解决方案:) – Thomas

1

在过去,我使用了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); 
    } 
0

不应该在文件路径中使用反斜杠'\'吗?假如这可以纠正你的文件路径,那么FindFirstFile API调用可能会成功,并且会为你提供所需的时间。