Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ///////////////////////////////////////////////////////////// Source.cpp
- #include "MyLib.h"
- extern bool isExit;
- void main() {
- setlocale(LC_ALL, "rus");
- MainMenu menu;
- menu.pushItem("Показать диски", showDrives);
- menu.pushItem("Информация о диске", showDriveInfo);
- menu.pushItem("Создать директорию", createDir);
- menu.pushItem("Удалить директорию", removeDir);
- menu.pushItem("Создать файл", createFile);
- menu.pushItem("Скопировать файл", copyFile);
- menu.pushItem("Переместить файл", moveFileEx);
- menu.pushItem("Получить атрибуты файла", getFileAttributes);
- menu.pushItem("Изменить атрибуты файла", setFileAttributes);
- menu.pushItem("Информация о файле", getFileInformationByHandle);
- menu.pushItem("Информация о датах файла", getFileTime);
- menu.pushItem("Изменение даты создания файла", setFileTime);
- menu.pushItem("Копирование с перекрывающимся вводом - выводом", asyncCopyOfFile);
- menu.pushItem("Выход", exit);
- do {
- MenuItem currentItem;
- currentItem = menu.itemSelection();
- currentItem.itemFun();
- } while (!isExit);
- }
- ///////////////////////////////////////////////////////////// MyLib.h
- #pragma once
- #include "MenuLib.h"
- extern bool isExit;
- void showDrives();
- UINT showDriveType(const LPSTR&);
- void showVolumeInformation(const TCHAR * diskName);
- void showDiskFreeSpace(const LPSTR& diskName);
- void showDriveInfo();
- void createDir();
- void removeDir();
- void createFile();
- void copyFile();
- void copyFile();
- void moveFileEx();
- void getFileAttributes();
- void setFileAttributes();
- void changeAttribute(const long, DWORD&, char*);
- void getFileInformationByHandle();
- void getFileTime();
- void setFileTime();
- void asyncCopyOfFile();
- VOID WINAPI asyncWrite(DWORD Code, DWORD nBytes, LPOVERLAPPED lpOv);
- VOID WINAPI asyncRead(DWORD Code, DWORD nBytes, LPOVERLAPPED lpOv);
- ///////////////////////////////////////////////////////////// MyLib.cpp
- #include "MyLib.h"
- extern bool isExit;
- TCHAR** bufferArray;
- LONGLONG doneCount, recordCount;
- LONGLONG overlapOperationsCount;
- OVERLAPPED* overlapR, * overlapW;
- HANDLE originalFile, cpyFile;
- LARGE_INTEGER fileSize, endOfFile;
- size_t numOfBytesToWrite = 4096;
- size_t bufferCoef;
- void showDrives() {
- TCHAR disks[256];
- TCHAR* currentDisk;
- cout << endl << "Доступные диски:" << endl;
- GetLogicalDriveStrings(256, disks);
- currentDisk = disks;
- while (*currentDisk != TEXT('\0')) {
- cout << currentDisk << endl;
- currentDisk = currentDisk + _tcslen(currentDisk) + 1;
- }
- waitPress();
- }
- UINT showDriveType(const LPSTR& diskName) {
- UINT driveTypeCode;
- driveTypeCode = GetDriveType(diskName);
- cout << endl;
- switch (driveTypeCode) {
- case DRIVE_UNKNOWN:
- cout << "DRIVE_UNKNOWN: тип привода не может быть определен" << endl;
- break;
- case DRIVE_NO_ROOT_DIR:
- cout << "DRIVE_NO_ROOT_DIR: корневой путь неверен (например, по указанному пути том не подключен)" << endl;
- break;
- case DRIVE_REMOVABLE:
- cout << "DRIVE_REMOVABLE: диск имеет съемный носитель (например, дисковод гибких дисков, флэш-накопитель или устройство чтения флэш-карт)" << endl;
- break;
- case DRIVE_FIXED:
- cout << "DRIVE_FIXED: диск имеет фиксированный носитель (например, жесткий диск или флешка)" << endl;
- break;
- case DRIVE_REMOTE:
- cout << "DRIVE_REMOTE: диск является удаленным (сетевым)" << endl;
- break;
- case DRIVE_CDROM:
- cout << "DRIVE_CDROM: диск представляет собой привод CD-ROM" << endl;
- break;
- case DRIVE_RAMDISK:
- cout << "DRIVE_RAMDISK: диск является RAM-диском" << endl;
- break;
- default:
- break;
- }
- return driveTypeCode;
- }
- void showVolumeInformation(const TCHAR * diskName) {
- TCHAR nameBuffer[MAX_PATH], sysNameBuffer[MAX_PATH];
- DWORD VSNumber, MCLength, systemFlags;
- GetVolumeInformation(diskName,
- nameBuffer, sizeof(nameBuffer),
- &VSNumber, &MCLength, &systemFlags,
- sysNameBuffer, sizeof(sysNameBuffer));
- cout << "Имя диска: " << diskName << endl;
- cout << "Серийный номер диска: " << VSNumber << endl;
- cout << "Имя файловой системы: " << sysNameBuffer << endl;
- if (systemFlags & FILE_CASE_PRESERVED_NAMES)
- cout << "FILE_CASE_PRESERVED_NAMES: указанный том поддерживает сохраненный регистр имен файлов, когда он помещает имя на диск" << endl;
- if (systemFlags & FILE_CASE_SENSITIVE_SEARCH)
- cout << "FILE_CASE_SENSITIVE_SEARCH: указанный том поддерживает имена файлов с учетом регистра" << endl;
- if (systemFlags & FILE_FILE_COMPRESSION)
- cout << "FILE_FILE_COMPRESSION: указанный том поддерживает файловое сжатие" << endl;
- if (systemFlags & FILE_NAMED_STREAMS)
- cout << "FILE_NAMED_STREAMS: указанный том поддерживает именованные потоки" << endl;
- if (systemFlags & FILE_PERSISTENT_ACLS)
- cout << "FILE_PERSISTENT_ACLS: указанный том сохраняет и применяет списки контроля доступа (ACL). Например, файловая система NTFS сохраняет и применяет ACL, а файловая система FAT - нет" << endl;
- if (systemFlags & FILE_READ_ONLY_VOLUME)
- cout << "FILE_READ_ONLY_VOLUME: указанный том доступен только для чтения" << endl;
- if (systemFlags & FILE_DAX_VOLUME)
- cout << "FILE_DAX_VOLUME: указанный том является томом прямого доступа (DAX)" << endl;
- if (systemFlags & FILE_SEQUENTIAL_WRITE_ONCE)
- cout << "FILE_SEQUENTIAL_WRITE_ONCE: указанный том поддерживает одну последовательную запись" << endl;
- if (systemFlags & FILE_SUPPORTS_ENCRYPTION)
- cout << "FILE_SUPPORTS_ENCRYPTION: указанный том поддерживает Зашифрованную файловую систему (EFS)" << endl;
- if (systemFlags & FILE_SUPPORTS_EXTENDED_ATTRIBUTES)
- cout << "FILE_SUPPORTS_EXTENDED_ATTRIBUTES: указанный том поддерживает расширенные атрибуты. Расширенный атрибут представляет собой часть специфичных для приложения метаданных, которые приложение может связать с файлом, и не является частью данных файла" << endl;
- if (systemFlags & FILE_SUPPORTS_HARD_LINKS)
- cout << "FILE_SUPPORTS_HARD_LINKS: указанный том поддерживает жесткие ссылки" << endl;
- if (systemFlags & FILE_SUPPORTS_OBJECT_IDS)
- cout << "FILE_SUPPORTS_OBJECT_IDS: указанный том поддерживает идентификаторы объектов" << endl;
- if (systemFlags & FILE_SUPPORTS_OPEN_BY_FILE_ID)
- cout << "FILE_SUPPORTS_OPEN_BY_FILE_ID: файловая система поддерживает открытие по FileID" << endl;
- if (systemFlags & FILE_SUPPORTS_REPARSE_POINTS)
- cout << "FILE_SUPPORTS_REPARSE_POINTS: указанный том поддерживает точки повторной обработки" << endl;
- if (systemFlags & FILE_SUPPORTS_SPARSE_FILES)
- cout << "FILE_SUPPORTS_SPARSE_FILES: указанный том поддерживает разреженные файлы" << endl;
- if (systemFlags & FILE_SUPPORTS_TRANSACTIONS)
- cout << "FILE_SUPPORTS_TRANSACTIONS: указанный том поддерживает транзакции" << endl;
- if (systemFlags & FILE_SUPPORTS_USN_JOURNAL)
- cout << "FILE_SUPPORTS_USN_JOURNAL: указанный том поддерживает журналы с порядковым номером обновления (USN)" << endl;
- if (systemFlags & FILE_UNICODE_ON_DISK)
- cout << "FILE_UNICODE_ON_DISK: указанный том поддерживает Юникод в именах файлов по мере их появления на диске" << endl;
- if (systemFlags & FILE_VOLUME_IS_COMPRESSED)
- cout << "FILE_VOLUME_IS_COMPRESSED): указанный том является сжатым томом, например томом DoubleSpace" << endl;
- if (systemFlags & FILE_VOLUME_QUOTAS)
- cout << "FILE_VOLUME_QUOTAS: указанный том поддерживает дисковые квоты" << endl;
- }
- void showDiskFreeSpace(const LPSTR& diskName) {
- DWORD sectorsPerCluster, bytesPerSector, freeClusters, totalClusters;
- GetDiskFreeSpace(diskName, §orsPerCluster, &bytesPerSector, &freeClusters, &totalClusters);
- unsigned __int64 free = (unsigned __int64)freeClusters * (unsigned __int64)sectorsPerCluster;
- free *= (unsigned __int64)bytesPerSector;
- unsigned __int64 total = (unsigned __int64)totalClusters * (unsigned __int64)sectorsPerCluster;
- total *= (unsigned __int64)bytesPerSector;
- cout << endl << "Дисковое пространство (свободное/всего): " << free << " (" << free / (1024 * 1024 * 1024) << " Гб) / " << total << " байт (" << total / (1024 * 1024 * 1024) << " Гб)" << endl;
- }
- void showDriveInfo() {
- TCHAR diskName[256];
- UINT driveTypeCode;
- cout << endl << "Введите название диска (C:\\\\): ";
- cin >> diskName;
- driveTypeCode = showDriveType(diskName);
- if (driveTypeCode != DRIVE_UNKNOWN && driveTypeCode != DRIVE_NO_ROOT_DIR) {
- showVolumeInformation(diskName);
- showDiskFreeSpace(diskName);
- }
- waitPress();
- }
- void createDir() {
- TCHAR dirName[256];
- cout << endl << "Введите полное имя новой директории: ";
- cin >> dirName;
- cout << endl;
- if (CreateDirectory(dirName, NULL))
- cout << "Директория успешно создана" << endl;
- else
- cout << "При создании директории произошла ошибка" << endl;
- waitPress();
- }
- void removeDir() {
- TCHAR dirName[256];
- cout << endl << "Введите полное имя удаляемой директории: ";
- cin >> dirName;
- cout << endl;
- if (RemoveDirectory(dirName))
- cout << "Директория успешно удалена" << endl;
- else
- cout << "Директория не была удалена" << endl;
- waitPress();
- }
- void createFile() {
- TCHAR fileName[256];
- HANDLE handle;
- cout << endl << "Введите полное имя нового файла: ";
- cin >> fileName;
- cout << endl;
- handle = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
- if (handle != 0)
- cout << "Файл успешно создан" << endl;
- else
- cout << "Файл не был создан" << endl;
- CloseHandle(handle);
- waitPress();
- }
- void copyFile() {
- TCHAR oldFileName[256], newFileName[256];
- cout << endl << "Введите полное имя копируемого файла: ";
- cin >> oldFileName;
- cout << "Введите полное новое имя файла: ";
- cin >> newFileName;
- cout << endl;
- if (CopyFile(oldFileName, newFileName, false))
- cout << "Файл успешно скопирован" << endl;
- else
- cout << "Произошла ошибка при копировании" << endl;
- waitPress();
- }
- void moveFileEx() {
- TCHAR oldFileName[256], newFileName[256];
- cout << endl << "Введите полное имя файла: ";
- cin >> oldFileName;
- cout << "Введите полное новое имя файла: ";
- cin >> newFileName;
- cout << endl;
- if (MoveFileEx(oldFileName, newFileName, MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING))
- cout << "Файл успешно перемещен" << endl;
- else
- cout << "Произошла ошибка при перемещении" << endl;
- waitPress();
- }
- void getFileAttributes() {
- TCHAR fileName[256];
- DWORD fileAttributes;
- cout << endl << "Введите полное имя файла: ";
- cin >> fileName;
- cout << endl;
- fileAttributes = GetFileAttributes(fileName);
- if (fileAttributes & FILE_ATTRIBUTE_ARCHIVE)
- cout << "FILE_ATTRIBUTE_ARCHIVE: файл или каталог, который является архивным файлом или каталогом. Приложения обычно используют этот атрибут, чтобы пометить файлы для резервного копирования или удаления" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_COMPRESSED)
- cout << "FILE_ATTRIBUTE_COMPRESSED: файл или каталог, который сжат. Для файла все данные в файле сжаты. Для каталога сжатие является значением по умолчанию для вновь создаваемых файлов и подкаталогов" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_DEVICE)
- cout << "FILE_ATTRIBUTE_DEVICE: это значение зарезервировано для использования системой" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_DIRECTORY)
- cout << "FILE_ATTRIBUTE_DIRECTORY: дескриптор, который идентифицирует каталог" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_ENCRYPTED)
- cout << "FILE_ATTRIBUTE_ENCRYPTED: файл или каталог, который зашифрован. Для файла все потоки данных в файле зашифрованы. Для каталога шифрование является значением по умолчанию для вновь создаваемых файлов и подкаталогов" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_HIDDEN)
- cout << "FILE_ATTRIBUTE_HIDDEN: Файл или каталог скрыт. Он не входит в обычный список каталогов" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_INTEGRITY_STREAM)
- cout << "FILE_ATTRIBUTE_INTEGRITY_STREAM: каталог или поток пользовательских данных настроен на целостность (поддерживается только на томах ReFS). Он не входит в обычный список каталогов. Настройка целостности сохраняется с файлом, если он переименован. Если файл копируется, для файла назначения будет установлена целостность, если для исходного файла или каталога назначения установлена целостность" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_NORMAL)
- cout << "FILE_ATTRIBUTE_NORMAL: файл, для которого не установлены другие атрибуты. Этот атрибут действителен только при использовании отдельно" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)
- cout << "FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: файл или каталог не должны индексироваться службой индексации содержимого" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_NO_SCRUB_DATA)
- cout << "FILE_ATTRIBUTE_NO_SCRUB_DATA: поток пользовательских данных не должен читаться фоновым сканером целостности данных (AKA scrubber). При установке в каталог он обеспечивает только наследование. Этот флаг поддерживается только в томах Storage Spaces и ReFS. Он не входит в обычный список каталогов" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_OFFLINE)
- cout << "FILE_ATTRIBUTE_OFFLINE: данные файла не доступны сразу. Этот атрибут указывает, что данные файла физически перемещаются в автономное хранилище. Этот атрибут используется удаленным хранилищем, которое является программным обеспечением для управления иерархическим хранилищем. Приложения не должны произвольно изменять этот атрибут" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_READONLY)
- cout << "FILE_ATTRIBUTE_READONLY: файл только для чтения. Приложения могут читать файл, но не могут записывать или удалять его. Этот атрибут не учитывается в каталогах" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS)
- cout << "FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS: когда этот атрибут установлен, это означает, что файл или каталог не полностью представлены локально. Для файла это означает, что не все его данные находятся в локальном хранилище (например, оно может быть разряжено, если некоторые данные все еще находятся в удаленном хранилище). Для каталога это означает, что часть содержимого каталога виртуализируется из другого места. Чтение файла / перечисление каталога будет дороже, чем обычно, например, это приведет к тому, что по меньшей мере часть содержимого файла / каталога будет выбрана из удаленного хранилища. Только вызывающие в режиме ядра могут установить этот бит" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_RECALL_ON_OPEN)
- cout << "FILE_ATTRIBUTE_RECALL_ON_OPEN: этот атрибут появляется только в классах перечисления каталога (FILE_DIRECTORY_INFORMATION, FILE_BOTH_DIR_INFORMATION и т. Д.). Когда этот атрибут установлен, это означает, что файл или каталог не имеют физического представления в локальной системе" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
- cout << "FILE_ATTRIBUTE_REPARSE_POINT: файл или каталог, с которым связана точка повторного анализа, или файл, который является символической ссылкой" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_SPARSE_FILE)
- cout << "FILE_ATTRIBUTE_SPARSE_FILE: файл, который является разреженным файлом" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_SYSTEM)
- cout << "FILE_ATTRIBUTE_SYSTEM: файл или каталог, который операционная система использует часть или использует исключительно" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_TEMPORARY)
- cout << "FILE_ATTRIBUTE_TEMPORARY: файл, который используется для временного хранения. Файловые системы избегают записи данных обратно в большое хранилище, если доступно достаточно кеш-памяти, потому что обычно приложение удаляет временный файл после закрытия дескриптора. В этом случае система может полностью избежать записи данных. В противном случае данные записываются после закрытия дескриптора" << endl;
- if (fileAttributes & FILE_ATTRIBUTE_VIRTUAL)
- cout << "FILE_ATTRIBUTE_VIRTUAL: это значение зарезервировано для использования системой" << endl;
- waitPress();
- }
- void setFileAttributes() {
- size_t attributeNum;
- TCHAR fileName[256];
- DWORD fileAttributes;
- cout << endl << "Введите полное имя файла: ";
- cin >> fileName;
- cout << endl;
- fileAttributes = GetFileAttributes(fileName);
- do {
- SubMenu attributeSelection;
- attributeSelection.pushItem("FILE_ATTRIBUTE_ARCHIVE");
- attributeSelection.pushItem("FILE_ATTRIBUTE_COMPRESSED");
- attributeSelection.pushItem("FILE_ATTRIBUTE_DEVICE");
- attributeSelection.pushItem("FILE_ATTRIBUTE_DIRECTORY");
- attributeSelection.pushItem("FILE_ATTRIBUTE_ENCRYPTED");
- attributeSelection.pushItem("FILE_ATTRIBUTE_HIDDEN");
- attributeSelection.pushItem("FILE_ATTRIBUTE_INTEGRITY_STREAM");
- attributeSelection.pushItem("FILE_ATTRIBUTE_NORMAL");
- attributeSelection.pushItem("FILE_ATTRIBUTE_NOT_CONTENT_INDEXED");
- attributeSelection.pushItem("FILE_ATTRIBUTE_NO_SCRUB_DATA");
- attributeSelection.pushItem("FILE_ATTRIBUTE_OFFLINE");
- attributeSelection.pushItem("FILE_ATTRIBUTE_READONLY");
- attributeSelection.pushItem("FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS");
- attributeSelection.pushItem("FILE_ATTRIBUTE_RECALL_ON_OPEN");
- attributeSelection.pushItem("FILE_ATTRIBUTE_REPARSE_POINT");
- attributeSelection.pushItem("FILE_ATTRIBUTE_SPARSE_FILE");
- attributeSelection.pushItem("FILE_ATTRIBUTE_SYSTEM");
- attributeSelection.pushItem("FILE_ATTRIBUTE_TEMPORARY");
- attributeSelection.pushItem("FILE_ATTRIBUTE_VIRTUAL");
- attributeSelection.pushItem("Выход");
- do {
- attributeNum = attributeSelection.itemSelection();
- } while (!isExit);
- isExit = false;
- switch (attributeNum) {
- case 1:
- changeAttribute(FILE_ATTRIBUTE_ARCHIVE, fileAttributes, fileName);
- waitPress();
- break;
- case 2:
- changeAttribute(FILE_ATTRIBUTE_COMPRESSED, fileAttributes, fileName);
- waitPress();
- break;
- case 3:
- changeAttribute(FILE_ATTRIBUTE_DEVICE, fileAttributes, fileName);
- waitPress();
- break;
- case 4:
- changeAttribute(FILE_ATTRIBUTE_DIRECTORY, fileAttributes, fileName);
- waitPress();
- break;
- case 5:
- changeAttribute(FILE_ATTRIBUTE_ENCRYPTED, fileAttributes, fileName);
- waitPress();
- break;
- case 6:
- changeAttribute(FILE_ATTRIBUTE_HIDDEN, fileAttributes, fileName);
- waitPress();
- break;
- case 7:
- changeAttribute(FILE_ATTRIBUTE_NORMAL, fileAttributes, fileName);
- waitPress();
- break;
- case 8:
- changeAttribute(FILE_ATTRIBUTE_INTEGRITY_STREAM, fileAttributes, fileName);
- waitPress();
- break;
- case 9:
- changeAttribute(FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, fileAttributes, fileName);
- waitPress();
- break;
- case 10:
- changeAttribute(FILE_ATTRIBUTE_NO_SCRUB_DATA, fileAttributes, fileName);
- waitPress();
- break;
- case 11:
- changeAttribute(FILE_ATTRIBUTE_OFFLINE, fileAttributes, fileName);
- waitPress();
- break;
- case 12:
- changeAttribute(FILE_ATTRIBUTE_READONLY, fileAttributes, fileName);
- waitPress();
- break;
- case 13:
- changeAttribute(FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS, fileAttributes, fileName);
- waitPress();
- break;
- case 14:
- changeAttribute(FILE_ATTRIBUTE_RECALL_ON_OPEN, fileAttributes, fileName);
- waitPress();
- break;
- case 15:
- changeAttribute(FILE_ATTRIBUTE_REPARSE_POINT, fileAttributes, fileName);
- waitPress();
- break;
- case 16:
- changeAttribute(FILE_ATTRIBUTE_SPARSE_FILE, fileAttributes, fileName);
- waitPress();
- break;
- case 17:
- changeAttribute(FILE_ATTRIBUTE_SYSTEM, fileAttributes, fileName);
- waitPress();
- break;
- case 18:
- changeAttribute(FILE_ATTRIBUTE_TEMPORARY, fileAttributes, fileName);
- waitPress();
- break;
- case 19:
- changeAttribute(FILE_ATTRIBUTE_VIRTUAL, fileAttributes, fileName);
- waitPress();
- break;
- case 20:
- isExit = true;
- break;
- }
- } while (!isExit);
- isExit = false;
- }
- void changeAttribute(const long _ATTRIBUTE, DWORD& fileAttributes, TCHAR* fileName) {
- size_t attributeNum;
- SubMenu actionSelection;
- actionSelection.pushItem("Вставить атрибут");
- actionSelection.pushItem("Удалить атрибут");
- actionSelection.pushItem("Отмена");
- do {
- attributeNum = actionSelection.itemSelection();
- } while (!isExit);
- isExit = false;
- switch (attributeNum) {
- case 1:
- fileAttributes |= _ATTRIBUTE;
- break;
- case 2:
- fileAttributes &= ~_ATTRIBUTE;
- break;
- case 3:
- break;
- }
- if (attributeNum != 3) {
- if (SetFileAttributes(fileName, fileAttributes))
- if (attributeNum == 1)
- cout << endl << "Аттрибут успешно установлен" << endl;
- else
- if (attributeNum == 2)
- cout << endl << "Аттрибут успешно удалён" << endl;
- else
- cout << endl << "Атрибут не был изменен" << endl;
- }
- else
- cout << endl << "Операция отменена" << endl;
- }
- void getFileInformationByHandle() {
- HANDLE handle;
- BY_HANDLE_FILE_INFORMATION fileInfo;
- TCHAR fileName[256];
- cout << endl << "Введите полное имя файла: ";
- cin >> fileName;
- cout << endl;
- handle = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);
- if (handle != 0) {
- if (GetFileInformationByHandle(handle, &fileInfo)) {
- cout << "Серийный номер тома: " << fileInfo.dwVolumeSerialNumber << endl;
- cout << "Аттрибуты файла: " << fileInfo.dwFileAttributes << endl;
- cout << "Количество ссылок: " << fileInfo.nNumberOfLinks << endl;
- cout << "Старшая часть размера файла: " << fileInfo.nFileSizeHigh << endl;
- cout << "Младшая часть размера файла: " << fileInfo.nFileSizeLow << endl;
- cout << "Старшая часть уникального идентификатора: " << fileInfo.nFileIndexHigh << endl;
- cout << "Младшая часть уникального идентификатора: " << fileInfo.nFileIndexLow << endl;
- }
- }
- else
- cout << "Не удалось получить дескриптор файла" << endl;
- CloseHandle(handle);
- waitPress();
- }
- void getFileTime() {
- HANDLE handle;
- TCHAR fileName[256];
- cout << endl << "Введите полное имя файла: ";
- cin >> fileName;
- cout << endl;
- handle = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
- if (handle != 0) {
- FILETIME fileCreatedTime, fileAccessedTime, fileWritedTime;
- SYSTEMTIME fileCreatedSystemTime, fileAccessedSystemTime, fileWritedSystemTime;
- TCHAR createdLocalDate[255], createdLocalTime[255], accessedLocalDate[255];
- TCHAR accessedLocalTime[255], writedLocalDate[255], writedLocalTime[255];
- if (GetFileTime(handle, &fileCreatedTime, &fileAccessedTime, &fileWritedTime) != 0) {
- FileTimeToLocalFileTime(&fileCreatedTime, &fileCreatedTime);
- FileTimeToLocalFileTime(&fileAccessedTime, &fileAccessedTime);
- FileTimeToLocalFileTime(&fileWritedTime, &fileWritedTime);
- FileTimeToSystemTime(&fileCreatedTime, &fileCreatedSystemTime);
- FileTimeToSystemTime(&fileAccessedTime, &fileAccessedSystemTime);
- FileTimeToSystemTime(&fileWritedTime, &fileWritedSystemTime);
- GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &fileCreatedSystemTime, NULL, createdLocalDate, 255);
- GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &fileAccessedSystemTime, NULL, accessedLocalDate, 255);
- GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &fileWritedSystemTime, NULL, writedLocalDate, 255);
- GetTimeFormat(LOCALE_USER_DEFAULT, 0, &fileCreatedSystemTime, NULL, createdLocalTime, 255);
- GetTimeFormat(LOCALE_USER_DEFAULT, 0, &fileAccessedSystemTime, NULL, accessedLocalTime, 255);
- GetTimeFormat(LOCALE_USER_DEFAULT, 0, &fileWritedSystemTime, NULL, writedLocalTime, 255);
- cout << "Время создания: " << fileCreatedSystemTime.wDay << "." << fileCreatedSystemTime.wMonth << "."
- << fileCreatedSystemTime.wYear << " " << fileCreatedSystemTime.wHour << ":"
- << fileCreatedSystemTime.wMinute << "" << endl;
- cout << "Последнее обращение: " << fileAccessedSystemTime.wDay << "." << fileAccessedSystemTime.wMonth << "."
- << fileAccessedSystemTime.wYear << " " << fileAccessedSystemTime.wHour << ":"
- << fileAccessedSystemTime.wMinute << "" << endl;
- cout << "Последнее изменение: " << fileWritedSystemTime.wDay << "." << fileWritedSystemTime.wMonth << "."
- << fileWritedSystemTime.wYear << " " << fileWritedSystemTime.wHour << ":"
- << fileWritedSystemTime.wMinute << "" << endl;
- }
- }
- else
- cout << "Не удалось получить дескриптор файла" << endl;
- CloseHandle(handle);
- waitPress();
- }
- void setFileTime() {
- HANDLE handle;
- TCHAR fileName[256];
- FILETIME fileTime;
- SYSTEMTIME systemTimeNow;
- cout << endl << "Введите полное имя файла: ";
- cin >> fileName;
- cout << endl;
- handle = CreateFile(fileName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING, 0, NULL);
- GetSystemTime(&systemTimeNow);
- SystemTimeToFileTime(&systemTimeNow, &fileTime);
- if (SetFileTime(handle, &fileTime, NULL, NULL))
- cout << "Время успешно установлено" << endl << systemTimeNow.wDay << "." << systemTimeNow.wMonth << "."
- << systemTimeNow.wYear << " " << systemTimeNow.wHour + 3 << ":" << systemTimeNow.wMinute << "" << endl;
- else
- cout << "Время не удалось установить" << endl;
- CloseHandle(handle);
- waitPress();
- }
- void asyncCopyOfFile() {
- LARGE_INTEGER curPosIn;
- DWORD startCopyTime, endCopyTime;
- TCHAR source[257], destination[257];
- cout << endl << "Введите полное имя файла: ";
- cin >> source;
- cout << "Введите новое полное имя файла: ";
- cin >> destination;
- cout << "Введите кол-во перекрывающих операций ввода-вывода: ";
- cin >> overlapOperationsCount;
- cout << "Введите кол-во кластеров: ";
- cin >> bufferCoef;
- cout << endl << "Множитель: " << bufferCoef << endl;
- numOfBytesToWrite *= bufferCoef;
- cout << "Один блок: " << numOfBytesToWrite << " байт" << endl;
- bufferArray = new TCHAR*[overlapOperationsCount];
- for (size_t i = 0; i < overlapOperationsCount; ++i)
- bufferArray[i] = new TCHAR[numOfBytesToWrite];
- overlapR = new OVERLAPPED[overlapOperationsCount];
- overlapW = new OVERLAPPED[overlapOperationsCount];
- originalFile = CreateFile(source, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING, NULL);
- cpyFile = CreateFile(destination, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING, NULL);
- GetFileSizeEx(originalFile, &fileSize);
- cout << "Размер файла: " << fileSize.QuadPart << " байт" << endl;
- recordCount = (fileSize.QuadPart + numOfBytesToWrite - 1) / numOfBytesToWrite;
- cout << "Количество блоков: " << recordCount << endl;
- startCopyTime = GetTickCount();
- curPosIn.QuadPart = 0;
- for (size_t i = 0; i < overlapOperationsCount; ++i) {
- overlapR[i].hEvent = (HANDLE)i;
- overlapW[i].hEvent = (HANDLE)i;
- overlapR[i].Offset = curPosIn.LowPart;
- overlapR[i].OffsetHigh = curPosIn.HighPart;
- if (curPosIn.QuadPart < fileSize.QuadPart)
- ReadFileEx(originalFile, bufferArray[i], numOfBytesToWrite, &overlapR[i], asyncRead);
- curPosIn.QuadPart += (LONGLONG)numOfBytesToWrite;
- }
- doneCount = 0;
- while (doneCount < 2 * recordCount)
- SleepEx(INFINITE, true);
- cout << endl << "Копирование успешно завершено!" << endl;
- endOfFile.QuadPart = fileSize.QuadPart;
- endOfFile.HighPart = fileSize.HighPart;
- SetFilePointerEx(cpyFile, endOfFile, 0, FILE_BEGIN);
- SetEndOfFile(cpyFile);
- delete[] overlapR;
- delete[] overlapW;
- for (size_t i = 0; i < overlapOperationsCount; ++i)
- delete[]bufferArray[i];
- delete[] bufferArray;
- CloseHandle(originalFile);
- CloseHandle(cpyFile);
- endCopyTime = GetTickCount();
- cout << endl << "Время выполнения: " << endCopyTime - startCopyTime << " мс" << endl;
- waitPress();
- }
- VOID WINAPI asyncWrite(DWORD Code, DWORD nBytes, LPOVERLAPPED lpOv) {
- LARGE_INTEGER curPosIn;
- DWORD i = (DWORD)(lpOv->hEvent);
- ++doneCount;
- curPosIn.LowPart = overlapR[i].Offset;
- curPosIn.HighPart = overlapR[i].OffsetHigh;
- if (curPosIn.QuadPart < fileSize.QuadPart)
- ReadFileEx(originalFile, bufferArray[i], numOfBytesToWrite, &overlapR[i], asyncRead);
- }
- VOID WINAPI asyncRead(DWORD Code, DWORD nBytes, LPOVERLAPPED lpOv) {
- LARGE_INTEGER curPosIn, curPosOut;
- DWORD i = (DWORD)(lpOv->hEvent);
- ++doneCount;
- curPosIn.LowPart = overlapR[i].Offset;
- curPosIn.HighPart = overlapR[i].OffsetHigh;
- curPosOut.QuadPart = (curPosIn.QuadPart / numOfBytesToWrite)*numOfBytesToWrite;
- overlapW[i].Offset = curPosOut.LowPart;
- overlapW[i].OffsetHigh = curPosOut.HighPart;
- WriteFileEx(cpyFile, bufferArray[i], numOfBytesToWrite, &overlapW[i], asyncWrite);
- curPosIn.QuadPart += numOfBytesToWrite * (LONGLONG)overlapOperationsCount;
- overlapR[i].Offset = curPosIn.LowPart;
- overlapR[i].OffsetHigh = curPosIn.HighPart;
- }
- ///////////////////////////////////////////////////////////// MenuLib.h
- #pragma once
- #include <vector>
- #include <iostream>
- #include <conio.h>
- #include <Windows.h>
- #include <tchar.h>
- using namespace std;
- void exit();
- void waitPress();
- struct MenuItem {
- void (*itemFun) ();
- string itemName;
- };
- class MainMenu {
- vector<MenuItem> items;
- size_t currentMenuItem;
- char input;
- public:
- MainMenu();
- MenuItem& itemSelection();
- void pushItem(string, void (*itemFun) ());
- };
- class SubMenu {
- vector<string> items;
- size_t currentMenuItem;
- char input;
- public:
- SubMenu();
- int itemSelection();
- void pushItem(string);
- };
- ///////////////////////////////////////////////////////////// MenuLib.cpp
- #include "MenuLib.h"
- extern bool isExit = false;
- void exit() {
- isExit = true;
- }
- void waitPress() {
- cout << "Нажмите любую клавишу...";
- _getch();
- }
- SubMenu::SubMenu() {
- currentMenuItem = 1;
- input = '0';
- }
- int SubMenu::itemSelection() {
- do {
- system("cls");
- cout << endl << "Выберите один пункт меню и нажмите Enter" << endl;
- for (size_t item = 1; item <= items.size(); ++item) {
- if (item == currentMenuItem)
- cout << "<< ";
- else
- cout << " ";
- cout << items.at(item - 1);
- if (item == currentMenuItem)
- cout << " >>";
- else
- cout << " ";
- cout << endl;
- }
- input = _getch();
- if (input == 'w' || input == 72) // UP
- --currentMenuItem;
- if (input == 's' || input == 80) // DOWN
- ++currentMenuItem;
- if (input == 13) // ENTER
- isExit = true;
- if (currentMenuItem > items.size())
- currentMenuItem = 1;
- if (currentMenuItem < 1)
- currentMenuItem = items.size();
- } while (!isExit);
- return currentMenuItem;
- }
- void SubMenu::pushItem(string name) {
- items.push_back(name);
- }
- MainMenu::MainMenu() {
- currentMenuItem = 1;
- input = '0';
- }
- MenuItem& MainMenu::itemSelection() {
- do {
- system("cls");
- for (size_t item = 1; item <= items.size(); ++item) {
- if (item == currentMenuItem)
- cout << "<< ";
- else
- cout << " ";
- cout << items.at(item - 1).itemName;
- if (item == currentMenuItem)
- cout << " >>";
- else
- cout << " ";
- cout << endl;
- }
- input = _getch();
- if (input == 'w' || input == 72) // UP
- --currentMenuItem;
- if (input == 's' || input == 80) // DOWN
- ++currentMenuItem;
- if (currentMenuItem > items.size())
- currentMenuItem = 1;
- if (currentMenuItem < 1)
- currentMenuItem = items.size();
- } while (input != 27 && input != 13); // ESCAPE && ENTER
- if (input == 27)
- return items.back();
- else
- return items.at(currentMenuItem - 1);
- }
- void MainMenu::pushItem(string name, void(*itemFun) ()) {
- MenuItem pushItem;
- pushItem.itemName = name;
- pushItem.itemFun = itemFun;
- items.push_back(pushItem);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement