2011-09-22 17 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調用可能會成功,並且會爲你提供所需的時間。