Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Федеральное государственное автономное
образовательное учреждение
высшего профессионального образования
____________Информационных технологий________
институт
________________________ _АСОИУ_____________________________
кафедра
КУРСОВАЯ РАБОТА
по предмету
ОПЕРАЦИОННЫЕ СИСТЕМЫ
на тему «Работа с атрибутами файлов»
Вариант № 11
Преподаватель __________
подпись, дата инициалы, фамилия
Студент __________
номер группы номер зачетной книжки подпись, дата инициалы, фамилия
2012
Содержание
[1] [1.1] 1.1 Универсальная функция CreateFile() [1.2] 1.2 Функция закрытия файла CloseHandle() [1.3] 1.3 Функция определения размера объекта GetFileSize() [1.4] 1.4 Функция определения атрибутов объекта GetFileAttributes()
[1.5] [1.6] 1.6 Функция получения времени объекта GetFileTime()
[2]
[3] [3.1] 3.1 Алгоритмы, описывающие работу программы
[3.2]
[4]
[5] |
Функция создания нового файла, открытия существующего файла или каталога CreateFile:
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
Функция CreateFile создает или открывает объекты (файлы, конвейеры и пр.) и возвращает дескриптор, который может использоваться при обращении к объекту.
Параметры:
lpFileName - указатель на строку с нулевым символом в конце, которая определяет имя создаваемого или уже существующего объекта (файл, конвейер, mailslot, ресурс связи, дисковое устройство, пульт, или каталог).
dwDesiredAccess - определяет тип доступа к открываемому объекту.
DwShareMode - набор битовых флажков, которые определяют режимы совместного использования открываемого или создаваемого объекта.
lpSecurityAttributes - указатель на дескриптор защиты или NULL, если этот дескриптор не используется.
DwCreationDistribution - определяет действия функции, если приложение пытается создать объект, который уже существует.
DwFlagsAndAttributes - определяет атрибуты и флаги для объекта.
HTemplateFile - определяет дескриптор к файлу шаблона. Файл шаблона обеспечивает атрибуты файла и расширенные атрибуты для создаваемого файла.
Возвращаемые значения:
1. Если функция заканчивается успешно, возвращаемое значение - идентификатор созданного или открытого объекта.
2. Если функция заканчивается аварийно, возвращаемое значение INVALID_HANDLE_VALUE. Чтобы получить расширенную информацию об ошибке, необходимо вызвать функцию GetLastError.
BOOL CloseHandle(
HANDLE hObject
);
Параметр:
HObject идентификатор закрываемого объекта.
Возвращаемые значения:
1. При успешном завершении функция возвращает значение TRUE.
2. Если функция заканчивается аварийно, возвращаемое значение = FALSE. Чтобы получить расширенную информацию об ошибке, необходимо вызвать функцию GetLastError.
DWORD GetFileSize (
HANDLE hFile,
LPDWORD lpFileSizeHigh
);
Параметры:
hFile идентификатор объекта, размер которого необходимо определить;
lpFileSizeHigh адрес старшего слова для размера объекта.
Возвращаемые значения:
1. При успешном завершении функция возвращает младшее 32-разрядное слово 64-разрядного размера объекта. Старшее слово размера объекта записывается в переменную типа DWORD, адрес которой передается функции через параметр lpFileSizeHigh.
2. Если функция заканчивается аварийно, возвращаемое значение = 0xFFFFFFFF, при этом в слово, адрес которого задается параметром lpFileSizeHigh, записывается значение NULL. Чтобы получить расширенную информацию об ошибке, необходимо вызвать функцию GetLastError.
DWORD GetFileAttributes (
LPCTSTR lpFileName
);
Параметр:
lpFileName указатель на строку с нулевым символом в конце, которая определяет полный или частичный путь к объекту.
Возвращаемое значение:
1. При успешном завершении функция возвращает слово, значение которого является логической комбинацией следующих атрибутов:
FILE_ATTRIBUTE_ARCHIVE (объект был архивирован),
FILE_ATTRIBUTE_COMPRESSED (объект динамически сжимается при записи и восстанавливается при чтении),
FILE_ATTRIBUTE_NORMAL (остальные атрибуты не установлены), FILE_ATTRIBUTE_HIDDEN (скрытый объект),
FILE_ATTRIBUTE_READONLY (объект можно только читать),
FILE_ATTRIBUTE_SYSTEM (объект является частью операционной системы).
BOOL SetFileAttributes (
LPCTSTR lpFileName,
DWORD dwFileAttributes
);
Параметры:
lpFileName указатель на строку с нулевым символом в конце, которая определяет полный или частичный путь к объекту;
dwFileAttributes слово, значение которого является логической комбинацией атрибутов объекта.
Возвращаемые значения:
1. При успешном завершении функция возвращает значение TRUE.
2. Если функция заканчивается аварийно, возвращаемое значение = FALSE. Чтобы получить расширенную информацию об ошибке, необходимо вызвать функцию GetLastError.
BOOL GetFileTime (
HANDLE hFile,
LPFILETIME lpCreationTime,
LPFILETIME lpLastAccessTime,
LPFILETIME lpLastWriteTime
);
Параметры:
hFile идентификатор объекта, для которого выполняется получение времени объекта;
lpCreationTime адрес структуры типа FILETIME, содержащей дату и время создания объекта;
lpLastAccessTime адрес структуры типа FILETIME, содержащей дату и время момента последнего доступа к объекту;
lpLastWriteTime адрес структуры типа FILETIME, содержащей дату и время момента, когда последний раз выполнялась запись данных в объект. Структура FILETIME хранит 64-разрядное значение даты и времени в виде количества интервалов размером 100 наносекунд от 1 января 1601 года и определена следующим образом:
typedef struct _FILETIME {
DWORD dwLowDateTime; // младшее слово
DWORD dwLowDateTime; // старшее слово
} FILETIME;
Возвращаемые значения:
1. При успешном завершении функция возвращает значение TRUE.
2. Если функция заканчивается аварийно, возвращаемое значение = FALSE. Чтобы получить расширенную информацию об ошибке, необходимо вызвать функцию GetLastError.
Задание на курсовую работу
1. Разработать приложение Win32 (API, MFC), с помощью которого можно:
- получить атрибуты файла (функция GetFileAttributes) и изменить атрибуты файла (функция SetFileAttributes);
- определить размер файла (функция GetFileSize);
- определить дату и время создания, последнего доступа и последней записи данных в файл (функция GetFileTime);
- получить информацию о файле по его идентификатору (функция GetFileInformationByHandle).
2. Все действия должны производиться по командам пользователя: из меню, либо расположенными в окне приложения кнопками.
3. Полученные результаты действий вывести на экран монитора.
Все необходимые возможности программы реализованы в двух функциях: OnChangeattr() и OnOpenfile(). Алгоритмы работы данных функций представлены на рисунках 1 и 2. С помощью первой функции происходит изменение атрибутов выбранного файла, с помощью второй получение и вывод на форму всей необходимой информации о файле.
Рисунок 1. Блочная схема алгоритма функции OnChangeattr()
Рисунок 2. Блочная схема алгоритма функции OnOpenfile()
Основная логика программы находится в файле FileAttribDlg.cpp. Ниже приведен листинг функции OnOpenfile() и OnChangeattr().
//Функция, срабатывающая при выборе файла
void CFileAttribDlg::OnOpenfile()
{
static char BASED_CODE szFilter[] = "|All Files (*.*)|*.*||";
//Открываем диалоговое окно для выбора файла
CFileDialog of( TRUE/*диалог открытия файла*/,
NULL/*директория по умолчанию*/,
NULL/*файл по умолчанию*/,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
szFilter,
NULL );
if (of.DoModal() == IDOK){ //Если файл был выбран
//Делаем активными флажки для выбора атрибутов файла
GetDlgItem(IDC_CHECK1)->EnableWindow();
GetDlgItem(IDC_CHECK2)->EnableWindow();
GetDlgItem(IDC_CHECK3)->EnableWindow();
GetDlgItem(IDC_CHECK4)->EnableWindow();
GetDlgItem(IDC_CHECK5)->EnableWindow();
GetDlgItem(IDC_CHECK6)->EnableWindow();
GetDlgItem(IDC_CHANGEATTR)->EnableWindow();
//Сбрасываем флажки для выбора атрибутов файла
m_check1 = FALSE;
m_check2 = FALSE;
m_check3 = FALSE;
m_check4 = FALSE;
m_check5 = FALSE;
m_check6 = FALSE;
m_editfile = of.GetPathName(); //Получаем имя выбранного файла
UpdateData(FALSE);
//Открываем выбранный файл
HANDLE hFile;
hFile = CreateFile(m_editfile, NULL, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
//Получаем атрибуты файла с помощью функции GetFileAttributes()
DWORD dwAttr = GetFileAttributes(m_editfile);
if(dwAttr == 0xffffffff)
{
DWORD dwError = GetLastError();
if(dwError == ERROR_FILE_NOT_FOUND)
{
MessageBox("Ошибка");
}
}
else
{
//Если ошибки нет, то выводим результат работы функции на форму
m_attriblist.ResetContent();
m_attriblist.AddString("Результат работы функции GetFileAttributes()");
m_attriblist.AddString(" - Атрибуты файла:");
if (dwAttr&FILE_ATTRIBUTE_ARCHIVE) { m_check1 = TRUE; m_attriblist.AddString(" * Объект был архивирован"); }
if (dwAttr&FILE_ATTRIBUTE_COMPRESSED) { m_check2 = TRUE; m_attriblist.AddString(" * Объект динамически сжимается при записи и восстанавливается при чтении"); }
if (dwAttr&FILE_ATTRIBUTE_HIDDEN) { m_check3 = TRUE; m_attriblist.AddString(" * Скрытый объект"); }
if (dwAttr&FILE_ATTRIBUTE_NORMAL) { m_check4 = TRUE; m_attriblist.AddString(" * Атрибуты не установлены"); }
if (dwAttr&FILE_ATTRIBUTE_READONLY) { m_check5 = TRUE; m_attriblist.AddString(" * Объект можно только читать"); }
if (dwAttr&FILE_ATTRIBUTE_SYSTEM) { m_check6 = TRUE; m_attriblist.AddString(" * Объект является частью операционной системы"); }
UpdateData(FALSE);
}
////////////////////////////////////////////////////////////////
//Находим размер файла с помощью функции GetFileSize()
DWORD dwSizeLow, dwSizeHigh;
dwSizeLow = GetFileSize(hFile, &dwSizeHigh);
DWORD dwError;
if (dwSizeLow == INVALID_FILE_SIZE
&&
(dwError = GetLastError()) != NO_ERROR )
{
MessageBox("Ошибка");
}
else
{
//Если ошибки нет, то выводим результат работы функции на форму
__int64 dwSize; //"Собираем" размер файла из двух слов (это необходимо для больших файлов)
dwSize=dwSizeHigh;
dwSize<<=32;
dwSize+=dwSizeLow;
CString buf;
buf.Format(" - Размер файла %I64d байт", dwSize);
m_attriblist.AddString("");
m_attriblist.AddString("Результат работы функции GetFileSize()");
m_attriblist.AddString("");
m_attriblist.AddString(buf);
}
////////////////////////////////////////////////////////////////
//Находим дату и время файла с помощью функции GetFileTime()
FILETIME lpCreationTime, lpLastAccessTime, lpLastWriteTime;
if (GetFileTime(hFile, &lpCreationTime, &lpLastAccessTime, &lpLastWriteTime))
{
//Если ошибки нет, то выводим результат работы функции на форму
CTime CreationTime(lpCreationTime); //Передаем полученное время в объекты класса CTime, чтобы удобно было выводить
CTime LastAccessTime(lpLastAccessTime);
CTime LastWriteTime(lpLastWriteTime);
m_attriblist.AddString("");
m_attriblist.AddString("Результат работы функции GetFileTime()");
m_attriblist.AddString("");
m_attriblist.AddString(CreationTime.Format(" - Дата и время создания файла: %d.%m.%Y, %H:%M:%S"));
m_attriblist.AddString(LastAccessTime.Format(" - Дата и время момента последнего доступа к файлу: %d.%m.%Y, %H:%M:%S"));
m_attriblist.AddString(LastWriteTime.Format(" - Дата и время момента последней записи в файл: %d.%m.%Y, %H:%M:%S"));
}
else
{
MessageBox("Ошибка");
}
/////////////////////////////////////////////////////////////////
//Выводим информацию о файле с помощью функции GetFileInformationByHandle()
m_attriblist.AddString("");
m_attriblist.AddString("Результат работы функции GetFileInformationByHandle()");
m_attriblist.AddString("");
BY_HANDLE_FILE_INFORMATION FileInformation;
if (GetFileInformationByHandle(hFile, &FileInformation))
{
//Если ошибки нет, то выводим результат работы функции на форму
//Выводим атрибуты файла
m_attriblist.AddString(" - Атрибуты файла:");
if (FileInformation.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) { m_attriblist.AddString(" * Объект был архивирован"); }
if (FileInformation.dwFileAttributes&FILE_ATTRIBUTE_COMPRESSED) { m_attriblist.AddString(" * Объект динамически сжимается при записи и восстанавливается при чтении"); }
if (FileInformation.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN) { m_attriblist.AddString(" * Скрытый объект"); }
if (FileInformation.dwFileAttributes&FILE_ATTRIBUTE_NORMAL) { m_attriblist.AddString(" * Атрибуты не установлены"); }
if (FileInformation.dwFileAttributes&FILE_ATTRIBUTE_READONLY) { m_attriblist.AddString(" * Объект можно только читать"); }
if (FileInformation.dwFileAttributes&FILE_ATTRIBUTE_SYSTEM) { m_attriblist.AddString(" * Объект является частью операционной системы"); }
//Выводим размер файла
__int64 dwSize; //"Собираем" размер файла из двух слов (это необходимо для больших файлов)
dwSize=FileInformation.nFileSizeHigh;
dwSize<<=32;
dwSize+=FileInformation.nFileSizeLow;
CString buf;
buf.Format(" - Размер файла: %I64d байт", dwSize);
m_attriblist.AddString("");
m_attriblist.AddString(buf);
//Выводим время и дату на форму
CTime CreTime(FileInformation.ftCreationTime); //Передаем полученное время в объекты класса CTime, чтобы удобно было выводить
CTime LATime(FileInformation.ftLastAccessTime);
CTime LWTime(FileInformation.ftLastWriteTime );
m_attriblist.AddString("");
m_attriblist.AddString(CreTime.Format(" - Дата и время создания файла: %d.%m.%Y, %H:%M:%S"));
m_attriblist.AddString(LATime.Format(" - Дата и время момента последнего доступа к файлу: %d.%m.%Y, %H:%M:%S"));
m_attriblist.AddString(LWTime.Format(" - Дата и время момента последней записи в файл: %d.%m.%Y, %H:%M:%S"));
}
else
{
MessageBox("Ошибка");
}
CloseHandle(hFile);
}
}
//Функция, срабатывающая при нажатии на кнопку "Изменить атрибуты файла"
void CFileAttribDlg::OnChangeattr()
{
UpdateData(TRUE);
DWORD dwAttr = FILE_ATTRIBUTE_NORMAL;
//Заполняем новые атрибуты файла из флажков на форме
if(m_check1) { dwAttr |= FILE_ATTRIBUTE_ARCHIVE; }
if(m_check2) { dwAttr |= FILE_ATTRIBUTE_COMPRESSED; }
if(m_check3) { dwAttr |= FILE_ATTRIBUTE_HIDDEN; }
if(m_check4) { dwAttr |= FILE_ATTRIBUTE_NORMAL; }
if(m_check5) { dwAttr |= FILE_ATTRIBUTE_READONLY; }
if(m_check6) { dwAttr |= FILE_ATTRIBUTE_SYSTEM; }
//Изменяем атрибуты файла
if (SetFileAttributes(m_editfile, dwAttr))
{
MessageBox("Атрибуты файла изменены");
}
else
{
MessageBox("Атрибуты файла не были изменены");
}
}
Для контрольного примера был использован файл «Новосибирск.rar», размер которого превышает 11 Гб. Результат работы программы представлен на рисунке 3.
Рисунок 3. Основная форма программы
1. Баженова, И.Ю. Visual C++ 6.0 (Visual Studio 98) / И.Ю. Баженова. М.: ДИАЛОГ-МИФИ, 1999. 407 с.
2. Фролов, А. В. Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT / А. В. Фролов, Г. В. Фролов. М.: Диалог-МИФИ, 1997. 272 с.
3. Ахо, А.В. Структуры данных и алгоритмы / А.В. Ахо, Дж.Э. Хопкрофт, Дж.Д. Ульман. М: Вильямс, 2000. 286 с.
4. Вирт, Н. Алгоритмы и структуры данных / Н. Вирт. М.: Мир, 1989. 267 с.
5. Кнут, Д.Э. Искусство программирования: В 3т. Т. 1 Основные алгоритмы / Д.Э. Кнут. Изд. 3-е М: Вильямс, 2000.
22