16,472
社区成员
发帖
与我相关
我的任务
分享
CFileStatus Status;
if (CFile::GetStatus(m_Location,Status))
{
Status.m_ctime = newCreateTime;
Status.m_mtime = newLastTime;
CFile::SetStatus(m_Location,Status);
}
void PASCAL CFile::SetStatus(LPCTSTR lpszFileName, const CFileStatus& status)
{
DWORD wAttr;
FILETIME creationTime;
FILETIME lastAccessTime;
FILETIME lastWriteTime;
LPFILETIME lpCreationTime = NULL;
LPFILETIME lpLastAccessTime = NULL;
LPFILETIME lpLastWriteTime = NULL;
if ((wAttr = GetFileAttributes((LPTSTR)lpszFileName)) == (DWORD)-1L)
CFileException::ThrowOsError((LONG)GetLastError(), lpszFileName);
if ((DWORD)status.m_attribute != wAttr && (wAttr & readOnly))
{
// Set file attribute, only if currently readonly.
// This way we will be able to modify the time assuming the
// caller changed the file from readonly.
if (!SetFileAttributes((LPTSTR)lpszFileName, (DWORD)status.m_attribute))
CFileException::ThrowOsError((LONG)GetLastError(), lpszFileName);
}
// last modification time
if (status.m_mtime.GetTime() != 0)
{
AfxTimeToFileTime(status.m_mtime, &lastWriteTime);
lpLastWriteTime = &lastWriteTime;
// last access time
if (status.m_atime.GetTime() != 0)
{
AfxTimeToFileTime(status.m_atime, &lastAccessTime);
lpLastAccessTime = &lastAccessTime;
}
// create time
if (status.m_ctime.GetTime() != 0)
{
AfxTimeToFileTime(status.m_ctime, &creationTime);
lpCreationTime = &creationTime;
}
HANDLE hFile = ::CreateFile(lpszFileName, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
CFileException::ThrowOsError((LONG)::GetLastError(), lpszFileName);
if (!SetFileTime((HANDLE)hFile, lpCreationTime, lpLastAccessTime, lpLastWriteTime))
{
LONG sc=(LONG)::GetLastError();
::CloseHandle(hFile);
CFileException::ThrowOsError(sc, lpszFileName);
}
if (!::CloseHandle(hFile))
CFileException::ThrowOsError((LONG)::GetLastError(), lpszFileName);
}
if ((DWORD)status.m_attribute != wAttr && !(wAttr & readOnly))
{
if (!SetFileAttributes((LPTSTR)lpszFileName, (DWORD)status.m_attribute))
CFileException::ThrowOsError((LONG)GetLastError(), lpszFileName);
}
}