Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otchet_3 (2).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.15 Mб
Скачать

Санкт-Петербургский государственный

электротехнический университет «ЛЭТИ»

им. В.И. Ульянова (Ленина)

(СПбГЭТУ «ЛЭТИ»)

ОТЧЕТ

к лабораторной работе №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, &sectorPerCluster, &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";

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]