Установите временную метку файла в произвольное время - PullRequest
0 голосов
/ 29 апреля 2020

Я хотел изменить временную метку файла на пользовательскую дату, я обнаружил следующий код, который должен изменить временную метку файла на текущее время, но это не работает. Как я могу реализовать функцию, которая может изменить метку времени файла на пользовательское время (указанное пользователем).

bool SetFileToCurrentTime(const char* arg_path, const char* arg_file_name)
{
    HANDLE h_File;
    FILETIME ft_FileTime;
    SYSTEMTIME st_SystemTime;

    char l_c_Path[MAX_PATH];

    strcpy(l_c_Path, arg_path);
    strcat(l_c_Path, arg_file_name);

    h_File = CreateFile(l_c_Path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    GetSystemTime(&st_SystemTime);              // Gets the current system time
    SystemTimeToFileTime(&st_SystemTime, &ft_FileTime);  // Converts the current system time to file time format

    if (SetFileTime(h_File, (LPFILETIME)NULL, (LPFILETIME)NULL, &ft_FileTime))
        return true;
    else
        return false;
}

1 Ответ

2 голосов
/ 29 апреля 2020

Я обнаружил следующий код, который должен изменить временную метку файла на текущее время, но он не работает

Я не знаю, что происходит не так, я понимаю У вас нет Windows компилятора для проверки, но вот некоторые возможности.

  • Проверьте возвращаемое значение SystemTimeToFileTime и CreateFile.
  • Используйте GetLastError, чтобы выяснить причину сбоя.
  • l_c_Path не помещает разделитель пути между путем и именем файла. Если вызывающий не предоставит один, путь будет неправильным. Распечатайте l_c_Path.

Вместо использования strcpy и strlcat рассмотрите возможность использования _makepath_s для объединения путей.

char l_c_Path[_MAX_PATH];
errno_t errorCode = _makepath_s(l_c_Path, _MAX_PATH, NULL, arg_path, arg_file_name, NULL);
if( errorCode ) {
  // check the errorCode
}

Как я могу реализовать функцию, которая может изменять метку времени файла на пользовательское время (указанное пользователем).

Вместо вызова GetSystemTime и преобразования его с SystemTimeToFileTime, иметь пропуск абонента в FILETIME.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...