

Программирование на языке MFC
Мой второй блог в серии программирования
Изменение информации о файле
Иногда у программиста может возникнуть необходимость каким-то образом изменить информацию о файле. Для этой цели класс CFile предлагает несколько методов. Начнем рассмотрение таковых с метода SetStatus(). Исходный код метода находится в файле filest.cpp:
void PASCAL CFile::SetStatus(LPCTSTR IpszFileName,
const CFileStatusS status)
{
DWORD wAttr;
FILETIME creationTime;
FILETIME lastAccessTime;
FILETIME lastWriteTime;
LPFILETIME lpCreationTime = NULL;
LPFILETIME lpLastAccessTime = NULL;
LPFILETIME lpLastWriteTime = NULL;
if ((wAttr = GetFileAttributes((LPTSTR)IpszFileName) ) ==
(DWORD)-1L)
CFileException::ThrowOsError((LONG)GetLastError() ) ;
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)IpszFileName, (DWORD)status.m_attribute)) CFileException::ThrowOsError((LONG)GetLastError() ) ;
}
// last modification time
if (status.m_mtime.GetTime() != 0)
{
AfxTimeToFileTime(status.m_mtime, &lastWriteTime) ; lpLastWriteTime = SlastWriteTime;
// last access time
if (status.m_atime.GetTime() != 0)
{
AfxTimeToFileTime(status,m_atime, SlastAccessTime); lpLastAccessTime = SlastAccessTime;
}
// create time
if (status.m_ctime.GetTime() != 0) {
AfxTimeToFileTime(status.m_ctime, ScreationTime); lpCreationTime = &creationTime;
}
HANDLE hFile = ::CreateFile(IpszFileName,
GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
CFileException::ThrowOsError((LONG)::GetLastError());
if (!SetFileTime((HANDLE)hFile,
lpCreationTime,
lpLastAccessTime,
lpLastWriteTime)) CFileException::ThrowOsError((LONG) ::GetLastError ());
if (!::CloseHandle(hFile))
CFileException::ThrowOsError((LONG)::GetLastError());
}
if ((DWORD)status.m_attribute != wAttr && !(wAttr & readonly))
{
if (!SetFileAttributes((LPTSTR)IpszFileName, (DWORD)status.m_attribute)) CFileException::ThrowOsError((LONG)GetLastError ());
}
}
Давайте, читатель, попробуем понять, что же делает этот метод. Во-первых, метод проверяет, не являются ли атрибуты файла ошибочными. При обнаружении об ошибке формируется исключение.
Похожие статьи: Изменение информации о файле
