Системное время C ++, возвращающее то же неверное значение - PullRequest
0 голосов
/ 22 сентября 2011

Я хочу получить дату последней записи в файл. Я написал этот код для него, но он возвращает мне 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;

Ответы [ 4 ]

6 голосов
/ 22 сентября 2011

Шестнадцатеричное значение для 52428 равно 0xCCCC, что указывает на то, что оно не было инициализировано.Возможно, вызов функции не удался.Проверьте коды возврата из FindFirstFile и FileTimeToSystemTime (а затем вызовите GetLastError после сбоя при поиске кода ошибки).

Редактировать На основании изменений в OP,вызов FindFirstFile, вероятно, является тем, который терпит неудачу.Возвращаемое значение является дескриптором (не нулевой / ненулевой результат).Код должен присвоить результат переменной типа HANDLE, а затем сравнить с INVALID_HANDLE_VALUE.

Также обратите внимание, что после успешного вызова FindFirstFile код должен иметь соответствующий вызов FindClose с ручкой, чтобы избежать утечки ресурсов.

5 голосов
/ 22 сентября 2011

Пожалуйста, проверьте документацию этой функции! Он говорит вам следующее:

Если функция завершается успешно, возвращаемое значение отлично от нуля.

Если функция не работает, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Попробуйте проверить, является ли возвращаемое значение ненулевым, если это не так, попробуйте вызвать getlasterror и распечатать это сообщение об ошибке на консоли и предоставить эту информацию.

1 голос
/ 22 сентября 2011

В прошлом я использовал 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 голосов
/ 23 сентября 2011

Разве вы не должны использовать обратную косую черту в пути к файлу? При условии, что это исправит ваш путь к файлу, вызов API FindFirstFile может быть успешным и даст вам необходимое время.

...