Программирование на языке 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 ());

}

}

Давайте, читатель, попробуем понять, что же делает этот метод. Во-первых, метод проверяет, не являются ли атрибуты файла оши­бочными. При обнаружении об ошибке формируется исключение.

Похожие статьи: