- •Void gld()
- •Void glds()
- •Void getDType(char *s)
- •Void getVolumeInf(char *s)
- •Void getDiskSize(char *s)
- •Void SetFAttributes(char *s)
- •Void GetFInformationByHandle(char *s)
- •Void GetFTime(char *s)
- •Void SetFTime(char *s)
- •3.2 Копирование файла с помощью операций перекрывающегося ввода-вывода.
- •Void main()
Санкт-Петербургский государственный
электротехнический университет «ЛЭТИ»
им. В.И. Ульянова (Ленина)
(СПбГЭТУ «ЛЭТИ»)
ОТЧЕТ
к лабораторной работе №3
«Управление файловой системой Windows»
Выполнил: Станевич Е.В.
Группа: 4306
Преподаватель: Тимофеев А.В.
Цель работы: исследовать управление файловой системой с помощью Win32 API.
Задание 3.1. Управление дисками, каталогами и файлами.
Проверка работоспособности приложения.
1. Вывод списка дисков.
2. Вывод информации о дисках.
3. Создание и удаление каталогов.
4. Создание файлов.
5. Копирование и перемещение файлов.
1) CopyFile()
2) MoveFile()
3)MoveFileEx()
6. Анализ и изменение атрибутов файлов.
1) GetFileAttributes()
2) SetFileAttributes()
3)GetFileInformationByHandle()
4) GetFileTime()
5) SetFileTime()
7. Определение идентификатора процесса приложения с помощью LiveKD, команда !process.
8. Анализ используемых приложением объектов, команда !handle.
8.1 Вывод списка дисков: список объектов не изменился.
8.2 Вывод информации о диске и размере свободного пространства: список объектов не изменился.
8.3 Создание и удаление каталогов: список объектов не изменился.
8.4 Создание файлов: список объектов не изменился.
8.5 Копирование и перемещение файлов: список объектов не изменился.
8.6 Анализ и изменение атрибутов файлов: список объектов не изменился.
9. Закрытие открытого приложением объекта типа «файл» с помощью утилиты Handle.
Вывод: в ходе работы было написано консольное приложение для работы с файлами и каталогами с использованием функций Win32 API, проверена его работоспособность. При анализе списка объектов в пунктах 1-6 изменений не происходило, так как эти операции не оставляют после себя открытых объектов, после каждой операции выполняется закрытие дескриптора объекта с помощью операции CloseHandle. При закрытии объекта типа «файл», используемого приложением, никакой реакции не последовало, по той же причине: все HANDLE к этому моменту уже закрыты.
Код программы.
#include <iostream>
#include <conio.h>
#include <Windows.h>
using namespace std;
void GLD();
void GLDS();
void getDType(char *s);
void getVolumeInf(char *s);
void getDiskSize(char *s);
void CreateDir(char *path);
void RemoveDir(char *path);
void CreateF(char *s);
void CopyF(char *s, char *s1);
void MoveF(char *s, char *s1);
void MoveFEx(char *s, char *s1);
void GetFAttributes(char *s);
void SetFAttributes(char *s);
void GetFInformationByHandle(char *s);
void GetFTime(char *s);
void SetFTime(char *s);
void main()
{
int m = 0, n;
do
{
system("cls");
setlocale(LC_ALL, "Russian");
cout << "Выберите дейтсвие:\n";
cout << "\n1 - вывод списка дисков;";
cout << "\n2 - вывод информации о диске и размере свободного пространства;";
cout << "\n3 - создание и удаление каталогов;";
cout << "\n4 - создание файлов в каталогах;";
cout << "\n5 - копирование и перемещение файлов;";
cout << "\n6 - анализ и изменение атрибутов файлов;";
cout << "\nДля выхода нажмите 'ESC'\n";
char s[MAX_PATH + 1];
char s1[MAX_PATH + 1];
m = _getch();
if ((char)m != 27)
{
switch (m)
{
case '1':
system("cls");
cout << "Выберите дейтсвие:\n";
cout << "1 - GetLogicalDrives();";
cout << "\n2 - GetLogicalDriveString();\n";
n = _getch();
switch (n)
{
case '1':
cout << "\nGetLogicalDrives()\n";
GLD();
break;
case '2':
cout << "\nGetLogicalDriveString()\n";
GLDS();
break;
}
break;
case '2':
system("cls");
cout << "Выберите дейтсвие:\n";
cout << "1 - GetDriveTypeA();";
cout << "\n2 - GetVolumeInformation();";
cout << "\n3 - GetDiskFreeSpaceA();\n";
n = _getch();
switch (n)
{
case '1':
cout << "\nGetDriveTypeA()\n";
cout << "Enter the disk name: ";
cin >> s;
getDType(s);
break;
case '2':
cout << "\nGetVolumeInformation()\n";
cout << "Enter the disk name: ";
cin >> s;
getVolumeInf(s);
break;
case '3':
cout << "\nGetDiskFreeSpaceA();\n";
cout << "Enter the disk name: ";
cin >> s;
getDiskSize(s);
break;
}
break;
case '3':
system("cls");
cout << "Выберите дейтсвие:\n";
cout << "1 - CreateDirectoryA();";
cout << "\n2 - RemoveDirectoryA();\n";
n = _getch();
switch (n)
{
case '1':
cout << "\nEnter the path to the directory: ";
cin >> s;
CreateDir(s);
break;
case '2':
cout << "\nEnter the path to the directory: ";
cin >> s;
RemoveDir(s);
break;
}
break;
case '4':
system("cls");
cout << "CreateFileA();";
cout << "\nEnter the path to the file: ";
cin >> s;
CreateF(s);
break;
case '5':
system("cls");
cout << "Выберите дейтсвие:\n";
cout << "1 - CopyFileA();";
cout << "\n2 - MoveFileA();";
cout << "\n3 - MoveFileEx();\n";
n = _getch();
switch (n)
{
case '1':
cout << "\nEnter the existing file name: ";
cin >> s;
cout << "\nEnter the new file name: ";
cin >> s1;
CopyF(s, s1);
break;
case '2':
cout << "\nEnter the existing file name: ";
cin >> s;
cout << "\nEnter the new file name: ";
cin >> s1;
MoveF(s, s1);
break;
case '3':
cout << "\nEnter the existing file name: ";
cin >> s;
cout << "\nEnter the new file name: ";
cin >> s1;
MoveFEx(s, s1);
break;
}
break;
case '6':
system("cls");
cout << "Выберите дейтсвие:\n";
cout << "1 - GetFileAttributes();";
cout << "\n2 - SetFileAttributes();";
cout << "\n3 - GetFileInformationByHandle();";
cout << "\n4 - GetFileTime();";
cout << "\n5 - SetFileTime();\n";
n = _getch();
switch (n)
{
case '1':
cout << "\nEnter the file name: ";
cin >> s;
GetFAttributes(s);
break;
case '2':
cout << "\nEnter the file name: ";
cin >> s;
SetFAttributes(s);
break;
case '3':
cout << "\nEnter the file name: ";
cin >> s;
GetFInformationByHandle(s);
break;
case '4':
cout << "\nEnter the file name: ";
cin >> s;
GetFTime(s);
break;
case '5':
cout << "\nEnter the file name: ";
cin >> s;
SetFTime(s);
GetFTime(s);
break;
}
break;
}
_getch();
}
} while ((char)m != 27);
}
Void gld()
{
int n;
char ch[4];
DWORD dw = GetLogicalDrives();
for (int i = 0; i < 26; i++)
{
n = (dw >> i) & 1;
if (n)
{
cout << "Drive: ";
ch[0] = char(65 + i);
ch[1] = ':';
ch[2] = '\\';
ch[3] = '\0';
cout << ch << '\n';
}
}
}
Void glds()
{
CHAR szDrives[MAX_PATH];
GetLogicalDriveStringsA(MAX_PATH, szDrives);
CHAR *ptr = szDrives;
while (*ptr)
{
cout << "Drive: ";
puts(ptr);
while (*++ptr)
ptr++;
ptr++;
}
}
Void getDType(char *s)
{
int nType = GetDriveTypeA(s);
cout << s << ' ';
switch (nType)
{
case DRIVE_UNKNOWN:
cout << "Drive Unknown.\n";
break;
case DRIVE_NO_ROOT_DIR:
cout << "The root path is invalid.\n";
break;
case DRIVE_REMOVABLE:
cout << "The drive has removable media.\n";
break;
case DRIVE_FIXED:
cout << "Fixed Drive.\n";
break;
case DRIVE_REMOTE:
cout << "The drive is a remote (network) drive.\n";
break;
case DRIVE_CDROM:
cout << "CD/DVD Drive.\n";
break;
case DRIVE_RAMDISK:
cout << "The drive is a RAM disk.\n";
break;
}
}
Void getVolumeInf(char *s)
{
CHAR nameBuf[MAX_PATH];
CHAR fileSystemBuf[MAX_PATH];
DWORD serialNumber, maxLen, systemFlags;
if (!GetVolumeInformationA(s, nameBuf, MAX_PATH,
&serialNumber, &maxLen, &systemFlags, fileSystemBuf, MAX_PATH))
{
cout << "Cannot retrieve volume information for ";
puts(s);
}
else
{
cout << "Information about volume ";
puts(s);
cout << "\tVolume Label: ";
puts(nameBuf);
cout << "\tSerial Number: " << HIWORD(serialNumber) << "-" << LOWORD(serialNumber);
cout << "\n\tSystem Flags: \n";
if (systemFlags & FS_CASE_IS_PRESERVED)
cout << "\tFS_CASE_IS_PRESERVED\n";
if (systemFlags & FS_CASE_SENSITIVE)
cout << "\tFS_CASE_SENSITIVE\n";
if (systemFlags & FS_UNICODE_STORED_ON_DISK)
cout << "\tFS_UNICODE_STORED_ON_DISK \n";
if (systemFlags & FS_PERSISTENT_ACLS)
cout << "\tFS_PERSISTENT_ACLS \n";
if (systemFlags & FS_FILE_COMPRESSION)
cout << "\tFS_FILE_COMPRESSION\n";
if (systemFlags & FS_VOL_IS_COMPRESSED)
cout << "\tFS_VOL_IS_COMPRESSED\n";
cout << "\tFile System: ";
puts(fileSystemBuf);
cout << "\n";
}
}
Void getDiskSize(char *s)
{
DWORD sectorPerCluster, bytesPerSector, numOfFreeClusters, totalNumOfClusters;
BOOL bSuccess = GetDiskFreeSpaceA(s, §orPerCluster, &bytesPerSector, &numOfFreeClusters, &totalNumOfClusters);
if (bSuccess)
{
long long freeB, totalB;
totalB = (long long)bytesPerSector*sectorPerCluster*totalNumOfClusters / (1024 * 1024);
freeB = (long long)bytesPerSector*sectorPerCluster*numOfFreeClusters / (1024 * 1024);
cout << "Drive " << *s << ":\\ has:";
cout << "\n\tTotal space: " << totalB << " MB";
cout << "\n\tAvaliable space: " << freeB << " MB" << "\n\n";
}
else
{
cout << "Could not get free space for ";
puts(s);
}
}
void CreateDir(char *path)
{
if (CreateDirectoryA(path, NULL))
cout << "Directory created\n";
else
cout << "Error create directory\n";
}
void RemoveDir(char *path)
{
if (RemoveDirectoryA(path))
cout << "Directory removed\n";
else
cout << "Error remove directory\n";
}
void CreateF(char *s)
{
HANDLE FileHandle = CreateFileA(s, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
if (FileHandle == INVALID_HANDLE_VALUE)
cout << "\nError creation file.";
else
cout << "\nFile created.";
CloseHandle(FileHandle);
}
void CopyF(char *s, char *s1)
{
if (CopyFileA(s, s1, true))
cout << "File was copied!";
else
cout << "Error copying file!";
}
void MoveF(char *s, char *s1)
{
if (MoveFileA(s, s1))
cout << "File was moved!";
else
cout << "Error!";
}
void MoveFEx(char *s, char *s1)
{
if (!MoveFileExA(s, s1, MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING))
cout << "Error!";
else
cout << "File was moved!";
}
void GetFAttributes(char *s)
{
DWORD dwAttrs = GetFileAttributesA(s);
if (dwAttrs == INVALID_FILE_ATTRIBUTES)
{
cout << "Error!";
return;
}
cout << "\nAttributes: \n";
if (dwAttrs & FILE_ATTRIBUTE_ARCHIVE)
cout << "\n\tFILE_ATTRIBUTE_ARCHIVE\n";
if (dwAttrs & FILE_ATTRIBUTE_COMPRESSED)
cout << "\tFILE_ATTRIBUTE_COMPRESSED\n";
if (dwAttrs & FILE_ATTRIBUTE_DEVICE)
cout << "\tFILE_ATTRIBUTE_DEVICE\n";
if (dwAttrs & FILE_ATTRIBUTE_DIRECTORY)
cout << "\tFILE_ATTRIBUTE_DIRECTORY\n";
if (dwAttrs & FILE_ATTRIBUTE_ENCRYPTED)
cout << "\tFILE_ATTRIBUTE_ENCRYPTED\n";
if (dwAttrs & FILE_ATTRIBUTE_HIDDEN)
cout << "\tFILE_ATTRIBUTE_HIDDEN\n";
if (dwAttrs & FILE_ATTRIBUTE_NORMAL)
cout << "\tFILE_ATTRIBUTE_NORMAL\n";
if (dwAttrs & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)
cout << "\tFILE_ATTRIBUTE_NOT_CONTENT_INDEXED\n";
if (dwAttrs & FILE_ATTRIBUTE_OFFLINE)
cout << "\tFILE_ATTRIBUTE_OFFLINE\n";
if (dwAttrs & FILE_ATTRIBUTE_READONLY)
cout << "\tFILE_ATTRIBUTE_READONLY\n";
if (dwAttrs & FILE_ATTRIBUTE_REPARSE_POINT)
cout << "\tFILE_ATTRIBUTE_REPARSE_POINT\n";
if (dwAttrs & FILE_ATTRIBUTE_SPARSE_FILE)
cout << "\tFILE_ATTRIBUTE_SPARSE_FILE\n";
if (dwAttrs & FILE_ATTRIBUTE_SYSTEM)
cout << "\tFILE_ATTRIBUTE_SYSTEM\n";
if (dwAttrs & FILE_ATTRIBUTE_TEMPORARY)
cout << "\tFILE_ATTRIBUTE_TEMPORARY\n";
}
