Advertisement
NikitaZamyslov

Zamyslovlab3

Nov 14th, 2019
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 36.81 KB | None | 0 0
  1. ///////////////////////////////////////////////////////////// Source.cpp
  2.  
  3. #include "MyLib.h"
  4.  
  5. extern bool isExit;
  6.  
  7. void main() {
  8.  
  9.     setlocale(LC_ALL, "rus");
  10.  
  11.     MainMenu menu;
  12.     menu.pushItem("Показать диски", showDrives);
  13.     menu.pushItem("Информация о диске", showDriveInfo);
  14.     menu.pushItem("Создать директорию", createDir);
  15.     menu.pushItem("Удалить директорию", removeDir);
  16.     menu.pushItem("Создать файл", createFile);
  17.     menu.pushItem("Скопировать файл", copyFile);
  18.     menu.pushItem("Переместить файл", moveFileEx);
  19.     menu.pushItem("Получить атрибуты файла", getFileAttributes);
  20.     menu.pushItem("Изменить атрибуты файла", setFileAttributes);
  21.     menu.pushItem("Информация о файле", getFileInformationByHandle);
  22.     menu.pushItem("Информация о датах файла", getFileTime);
  23.     menu.pushItem("Изменение даты создания файла", setFileTime);
  24.     menu.pushItem("Копирование с перекрывающимся вводом - выводом", asyncCopyOfFile);
  25.     menu.pushItem("Выход", exit);
  26.  
  27.     do {
  28.  
  29.         MenuItem currentItem;
  30.         currentItem = menu.itemSelection();
  31.         currentItem.itemFun();
  32.     } while (!isExit);
  33. }
  34.  
  35. ///////////////////////////////////////////////////////////// MyLib.h
  36. #pragma once
  37. #include "MenuLib.h"
  38.  
  39. extern bool isExit;
  40.  
  41. void showDrives();
  42. UINT showDriveType(const LPSTR&);
  43. void showVolumeInformation(const TCHAR * diskName);
  44. void showDiskFreeSpace(const LPSTR& diskName);
  45. void showDriveInfo();
  46. void createDir();
  47. void removeDir();
  48. void createFile();
  49. void copyFile();
  50. void copyFile();
  51. void moveFileEx();
  52. void getFileAttributes();
  53. void setFileAttributes();
  54. void changeAttribute(const long, DWORD&, char*);
  55. void getFileInformationByHandle();
  56. void getFileTime();
  57. void setFileTime();
  58. void asyncCopyOfFile();
  59.  
  60. VOID WINAPI asyncWrite(DWORD Code, DWORD nBytes, LPOVERLAPPED lpOv);
  61. VOID WINAPI asyncRead(DWORD Code, DWORD nBytes, LPOVERLAPPED lpOv);
  62.  
  63. ///////////////////////////////////////////////////////////// MyLib.cpp
  64.  
  65. #include "MyLib.h"
  66.  
  67. extern bool isExit;
  68.  
  69. TCHAR** bufferArray;
  70. LONGLONG  doneCount, recordCount;
  71. LONGLONG overlapOperationsCount;
  72. OVERLAPPED* overlapR, * overlapW;
  73. HANDLE originalFile, cpyFile;
  74. LARGE_INTEGER fileSize, endOfFile;
  75. size_t numOfBytesToWrite = 4096;
  76. size_t bufferCoef;
  77.  
  78. void showDrives() {
  79.  
  80.     TCHAR disks[256];
  81.     TCHAR* currentDisk;
  82.  
  83.     cout << endl << "Доступные диски:" << endl;
  84.  
  85.     GetLogicalDriveStrings(256, disks);
  86.     currentDisk = disks;
  87.  
  88.     while (*currentDisk != TEXT('\0')) {
  89.  
  90.         cout << currentDisk << endl;
  91.         currentDisk = currentDisk + _tcslen(currentDisk) + 1;
  92.     }
  93.  
  94.     waitPress();
  95. }
  96.  
  97.  
  98. UINT showDriveType(const LPSTR& diskName) {
  99.  
  100.     UINT driveTypeCode;
  101.     driveTypeCode = GetDriveType(diskName);
  102.  
  103.     cout << endl;
  104.     switch (driveTypeCode) {
  105.     case DRIVE_UNKNOWN:
  106.         cout << "DRIVE_UNKNOWN: тип привода не может быть определен" << endl;
  107.         break;
  108.     case DRIVE_NO_ROOT_DIR:
  109.         cout << "DRIVE_NO_ROOT_DIR: корневой путь неверен (например, по указанному пути том не подключен)" << endl;
  110.         break;
  111.     case DRIVE_REMOVABLE:
  112.         cout << "DRIVE_REMOVABLE: диск имеет съемный носитель (например, дисковод гибких дисков, флэш-накопитель или устройство чтения флэш-карт)" << endl;
  113.         break;
  114.     case DRIVE_FIXED:
  115.         cout << "DRIVE_FIXED: диск имеет фиксированный носитель (например, жесткий диск или флешка)" << endl;
  116.         break;
  117.     case DRIVE_REMOTE:
  118.         cout << "DRIVE_REMOTE: диск является удаленным (сетевым)" << endl;
  119.         break;
  120.     case DRIVE_CDROM:
  121.         cout << "DRIVE_CDROM: диск представляет собой привод CD-ROM" << endl;
  122.         break;
  123.     case DRIVE_RAMDISK:
  124.         cout << "DRIVE_RAMDISK: диск является RAM-диском" << endl;
  125.         break;
  126.     default:
  127.         break;
  128.     }
  129.  
  130.     return driveTypeCode;
  131. }
  132.  
  133.  
  134. void showVolumeInformation(const TCHAR * diskName) {
  135.  
  136.     TCHAR nameBuffer[MAX_PATH], sysNameBuffer[MAX_PATH];
  137.     DWORD VSNumber, MCLength, systemFlags;
  138.  
  139.     GetVolumeInformation(diskName,
  140.         nameBuffer, sizeof(nameBuffer),
  141.         &VSNumber, &MCLength, &systemFlags,
  142.         sysNameBuffer, sizeof(sysNameBuffer));
  143.  
  144.     cout << "Имя диска: " << diskName << endl;
  145.     cout << "Серийный номер диска: " << VSNumber << endl;
  146.     cout << "Имя файловой системы: " << sysNameBuffer << endl;
  147.  
  148.     if (systemFlags & FILE_CASE_PRESERVED_NAMES)
  149.         cout << "FILE_CASE_PRESERVED_NAMES: указанный том поддерживает сохраненный регистр имен файлов, когда он помещает имя на диск" << endl;
  150.  
  151.     if (systemFlags & FILE_CASE_SENSITIVE_SEARCH)
  152.         cout << "FILE_CASE_SENSITIVE_SEARCH: указанный том поддерживает имена файлов с учетом регистра" << endl;
  153.  
  154.     if (systemFlags & FILE_FILE_COMPRESSION)
  155.         cout << "FILE_FILE_COMPRESSION: указанный том поддерживает файловое сжатие" << endl;
  156.  
  157.     if (systemFlags & FILE_NAMED_STREAMS)
  158.         cout << "FILE_NAMED_STREAMS: указанный том поддерживает именованные потоки" << endl;
  159.  
  160.     if (systemFlags & FILE_PERSISTENT_ACLS)
  161.         cout << "FILE_PERSISTENT_ACLS: указанный том сохраняет и применяет списки контроля доступа (ACL). Например, файловая система NTFS сохраняет и применяет ACL, а файловая система FAT - нет" << endl;
  162.  
  163.     if (systemFlags & FILE_READ_ONLY_VOLUME)
  164.         cout << "FILE_READ_ONLY_VOLUME: указанный том доступен только для чтения" << endl;
  165.  
  166.     if (systemFlags & FILE_DAX_VOLUME)
  167.         cout << "FILE_DAX_VOLUME: указанный том является томом прямого доступа (DAX)" << endl;
  168.  
  169.     if (systemFlags & FILE_SEQUENTIAL_WRITE_ONCE)
  170.         cout << "FILE_SEQUENTIAL_WRITE_ONCE: указанный том поддерживает одну последовательную запись" << endl;
  171.  
  172.     if (systemFlags & FILE_SUPPORTS_ENCRYPTION)
  173.         cout << "FILE_SUPPORTS_ENCRYPTION: указанный том поддерживает Зашифрованную файловую систему (EFS)" << endl;
  174.  
  175.     if (systemFlags & FILE_SUPPORTS_EXTENDED_ATTRIBUTES)
  176.         cout << "FILE_SUPPORTS_EXTENDED_ATTRIBUTES: указанный том поддерживает расширенные атрибуты. Расширенный атрибут представляет собой часть специфичных для приложения метаданных, которые приложение может связать с файлом, и не является частью данных файла" << endl;
  177.  
  178.     if (systemFlags & FILE_SUPPORTS_HARD_LINKS)
  179.         cout << "FILE_SUPPORTS_HARD_LINKS: указанный том поддерживает жесткие ссылки" << endl;
  180.  
  181.     if (systemFlags & FILE_SUPPORTS_OBJECT_IDS)
  182.         cout << "FILE_SUPPORTS_OBJECT_IDS: указанный том поддерживает идентификаторы объектов" << endl;
  183.  
  184.     if (systemFlags & FILE_SUPPORTS_OPEN_BY_FILE_ID)
  185.         cout << "FILE_SUPPORTS_OPEN_BY_FILE_ID: файловая система поддерживает открытие по FileID" << endl;
  186.  
  187.     if (systemFlags & FILE_SUPPORTS_REPARSE_POINTS)
  188.         cout << "FILE_SUPPORTS_REPARSE_POINTS: указанный том поддерживает точки повторной обработки" << endl;
  189.  
  190.     if (systemFlags & FILE_SUPPORTS_SPARSE_FILES)
  191.         cout << "FILE_SUPPORTS_SPARSE_FILES: указанный том поддерживает разреженные файлы" << endl;
  192.  
  193.     if (systemFlags & FILE_SUPPORTS_TRANSACTIONS)
  194.         cout << "FILE_SUPPORTS_TRANSACTIONS: указанный том поддерживает транзакции" << endl;
  195.  
  196.     if (systemFlags & FILE_SUPPORTS_USN_JOURNAL)
  197.         cout << "FILE_SUPPORTS_USN_JOURNAL: указанный том поддерживает журналы с порядковым номером обновления (USN)" << endl;
  198.  
  199.     if (systemFlags & FILE_UNICODE_ON_DISK)
  200.         cout << "FILE_UNICODE_ON_DISK: указанный том поддерживает Юникод в именах файлов по мере их появления на диске" << endl;
  201.  
  202.     if (systemFlags & FILE_VOLUME_IS_COMPRESSED)
  203.         cout << "FILE_VOLUME_IS_COMPRESSED): указанный том является сжатым томом, например томом DoubleSpace" << endl;
  204.  
  205.     if (systemFlags & FILE_VOLUME_QUOTAS)
  206.         cout << "FILE_VOLUME_QUOTAS: указанный том поддерживает дисковые квоты" << endl;
  207. }
  208.  
  209.  
  210. void showDiskFreeSpace(const LPSTR& diskName) {
  211.  
  212.     DWORD sectorsPerCluster, bytesPerSector, freeClusters, totalClusters;
  213.  
  214.     GetDiskFreeSpace(diskName, &sectorsPerCluster, &bytesPerSector, &freeClusters, &totalClusters);
  215.  
  216.     unsigned __int64 free = (unsigned __int64)freeClusters * (unsigned __int64)sectorsPerCluster;
  217.     free *= (unsigned __int64)bytesPerSector;
  218.     unsigned __int64 total = (unsigned __int64)totalClusters * (unsigned __int64)sectorsPerCluster;
  219.     total *= (unsigned __int64)bytesPerSector;
  220.  
  221.     cout << endl << "Дисковое пространство (свободное/всего): " << free << " (" << free / (1024 * 1024 * 1024) <<  " Гб) / " << total << " байт (" << total / (1024 * 1024 * 1024) << " Гб)" << endl;
  222. }
  223.  
  224.  
  225. void showDriveInfo() {
  226.  
  227.     TCHAR diskName[256];
  228.     UINT driveTypeCode;
  229.  
  230.     cout << endl << "Введите название диска (C:\\\\): ";
  231.     cin >> diskName;
  232.  
  233.     driveTypeCode = showDriveType(diskName);
  234.     if (driveTypeCode != DRIVE_UNKNOWN && driveTypeCode != DRIVE_NO_ROOT_DIR) {
  235.  
  236.         showVolumeInformation(diskName);
  237.         showDiskFreeSpace(diskName);
  238.     }
  239.  
  240.     waitPress();
  241. }
  242.  
  243.  
  244. void createDir() {
  245.  
  246.     TCHAR dirName[256];
  247.  
  248.     cout << endl << "Введите полное имя новой директории: ";
  249.     cin >> dirName;
  250.     cout << endl;
  251.  
  252.     if (CreateDirectory(dirName, NULL))
  253.         cout << "Директория успешно создана" << endl;
  254.     else
  255.         cout << "При создании директории произошла ошибка" << endl;
  256.  
  257.     waitPress();
  258. }
  259.  
  260.  
  261. void removeDir() {
  262.  
  263.     TCHAR dirName[256];
  264.  
  265.     cout << endl << "Введите полное имя удаляемой директории: ";
  266.     cin >> dirName;
  267.     cout << endl;
  268.  
  269.     if (RemoveDirectory(dirName))
  270.         cout << "Директория успешно удалена" << endl;
  271.     else
  272.         cout << "Директория не была удалена" << endl;
  273.  
  274.     waitPress();
  275. }
  276.  
  277.  
  278. void createFile() {
  279.  
  280.     TCHAR fileName[256];
  281.     HANDLE handle;
  282.  
  283.     cout << endl << "Введите полное имя нового файла: ";
  284.     cin >> fileName;
  285.     cout << endl;
  286.  
  287.     handle = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
  288.  
  289.     if (handle != 0)
  290.         cout << "Файл успешно создан" << endl;
  291.     else
  292.         cout << "Файл не был создан" << endl;
  293.  
  294.     CloseHandle(handle);
  295.  
  296.     waitPress();
  297. }
  298.  
  299.  
  300. void copyFile() {
  301.  
  302.     TCHAR oldFileName[256], newFileName[256];
  303.  
  304.     cout << endl << "Введите полное имя копируемого файла: ";
  305.     cin >> oldFileName;
  306.  
  307.     cout << "Введите полное новое имя файла: ";
  308.     cin >> newFileName;
  309.     cout << endl;
  310.  
  311.     if (CopyFile(oldFileName, newFileName, false))
  312.         cout << "Файл успешно скопирован" << endl;
  313.     else
  314.         cout << "Произошла ошибка при копировании" << endl;
  315.  
  316.     waitPress();
  317. }
  318.  
  319.  
  320. void moveFileEx() {
  321.  
  322.     TCHAR oldFileName[256], newFileName[256];
  323.  
  324.     cout << endl << "Введите полное имя файла: ";
  325.     cin >> oldFileName;
  326.  
  327.     cout << "Введите полное новое имя файла: ";
  328.     cin >> newFileName;
  329.     cout << endl;
  330.  
  331.     if (MoveFileEx(oldFileName, newFileName, MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING))
  332.         cout << "Файл успешно перемещен" << endl;
  333.     else
  334.         cout << "Произошла ошибка при перемещении" << endl;
  335.  
  336.     waitPress();
  337. }
  338.  
  339.  
  340. void getFileAttributes() {
  341.  
  342.     TCHAR fileName[256];
  343.     DWORD fileAttributes;
  344.  
  345.     cout << endl << "Введите полное имя файла: ";
  346.     cin >> fileName;
  347.     cout << endl;
  348.  
  349.     fileAttributes = GetFileAttributes(fileName);
  350.  
  351.     if (fileAttributes & FILE_ATTRIBUTE_ARCHIVE)
  352.         cout << "FILE_ATTRIBUTE_ARCHIVE: файл или каталог, который является архивным файлом или каталогом. Приложения обычно используют этот атрибут, чтобы пометить файлы для резервного копирования или удаления" << endl;
  353.  
  354.     if (fileAttributes & FILE_ATTRIBUTE_COMPRESSED)
  355.         cout << "FILE_ATTRIBUTE_COMPRESSED: файл или каталог, который сжат. Для файла все данные в файле сжаты. Для каталога сжатие является значением по умолчанию для вновь создаваемых файлов и подкаталогов" << endl;
  356.  
  357.     if (fileAttributes & FILE_ATTRIBUTE_DEVICE)
  358.         cout << "FILE_ATTRIBUTE_DEVICE: это значение зарезервировано для использования системой" << endl;
  359.  
  360.     if (fileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  361.         cout << "FILE_ATTRIBUTE_DIRECTORY: дескриптор, который идентифицирует каталог" << endl;
  362.  
  363.     if (fileAttributes & FILE_ATTRIBUTE_ENCRYPTED)
  364.         cout << "FILE_ATTRIBUTE_ENCRYPTED: файл или каталог, который зашифрован. Для файла все потоки данных в файле зашифрованы. Для каталога шифрование является значением по умолчанию для вновь создаваемых файлов и подкаталогов" << endl;
  365.  
  366.     if (fileAttributes & FILE_ATTRIBUTE_HIDDEN)
  367.         cout << "FILE_ATTRIBUTE_HIDDEN: Файл или каталог скрыт. Он не входит в обычный список каталогов" << endl;
  368.  
  369.     if (fileAttributes & FILE_ATTRIBUTE_INTEGRITY_STREAM)
  370.         cout << "FILE_ATTRIBUTE_INTEGRITY_STREAM: каталог или поток пользовательских данных настроен на целостность (поддерживается только на томах ReFS). Он не входит в обычный список каталогов. Настройка целостности сохраняется с файлом, если он переименован. Если файл копируется, для файла назначения будет установлена целостность, если для исходного файла или каталога назначения установлена целостность" << endl;
  371.    
  372.     if (fileAttributes & FILE_ATTRIBUTE_NORMAL)
  373.         cout << "FILE_ATTRIBUTE_NORMAL: файл, для которого не установлены другие атрибуты. Этот атрибут действителен только при использовании отдельно" << endl;
  374.    
  375.     if (fileAttributes & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)
  376.         cout << "FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: файл или каталог не должны индексироваться службой индексации содержимого" << endl;
  377.    
  378.     if (fileAttributes & FILE_ATTRIBUTE_NO_SCRUB_DATA)
  379.         cout << "FILE_ATTRIBUTE_NO_SCRUB_DATA: поток пользовательских данных не должен читаться фоновым сканером целостности данных (AKA scrubber). При установке в каталог он обеспечивает только наследование. Этот флаг поддерживается только в томах Storage Spaces и ReFS. Он не входит в обычный список каталогов" << endl;
  380.    
  381.     if (fileAttributes & FILE_ATTRIBUTE_OFFLINE)
  382.         cout << "FILE_ATTRIBUTE_OFFLINE: данные файла не доступны сразу. Этот атрибут указывает, что данные файла физически перемещаются в автономное хранилище. Этот атрибут используется удаленным хранилищем, которое является программным обеспечением для управления иерархическим хранилищем. Приложения не должны произвольно изменять этот атрибут" << endl;
  383.    
  384.     if (fileAttributes & FILE_ATTRIBUTE_READONLY)
  385.         cout << "FILE_ATTRIBUTE_READONLY: файл только для чтения. Приложения могут читать файл, но не могут записывать или удалять его. Этот атрибут не учитывается в каталогах" << endl;
  386.    
  387.     if (fileAttributes & FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS)
  388.         cout << "FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS: когда этот атрибут установлен, это означает, что файл или каталог не полностью представлены локально. Для файла это означает, что не все его данные находятся в локальном хранилище (например, оно может быть разряжено, если некоторые данные все еще находятся в удаленном хранилище). Для каталога это означает, что часть содержимого каталога виртуализируется из другого места. Чтение файла / перечисление каталога будет дороже, чем обычно, например, это приведет к тому, что по меньшей мере часть содержимого файла / каталога будет выбрана из удаленного хранилища. Только вызывающие в режиме ядра могут установить этот бит" << endl;
  389.    
  390.     if (fileAttributes & FILE_ATTRIBUTE_RECALL_ON_OPEN)
  391.         cout << "FILE_ATTRIBUTE_RECALL_ON_OPEN: этот атрибут появляется только в классах перечисления каталога (FILE_DIRECTORY_INFORMATION, FILE_BOTH_DIR_INFORMATION и т. Д.). Когда этот атрибут установлен, это означает, что файл или каталог не имеют физического представления в локальной системе" << endl;
  392.    
  393.     if (fileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
  394.         cout << "FILE_ATTRIBUTE_REPARSE_POINT: файл или каталог, с которым связана точка повторного анализа, или файл, который является символической ссылкой" << endl;
  395.    
  396.     if (fileAttributes & FILE_ATTRIBUTE_SPARSE_FILE)
  397.         cout << "FILE_ATTRIBUTE_SPARSE_FILE: файл, который является разреженным файлом" << endl;
  398.    
  399.     if (fileAttributes & FILE_ATTRIBUTE_SYSTEM)
  400.         cout << "FILE_ATTRIBUTE_SYSTEM: файл или каталог, который операционная система использует часть или использует исключительно" << endl;
  401.    
  402.     if (fileAttributes & FILE_ATTRIBUTE_TEMPORARY)
  403.         cout << "FILE_ATTRIBUTE_TEMPORARY: файл, который используется для временного хранения. Файловые системы избегают записи данных обратно в большое хранилище, если доступно достаточно кеш-памяти, потому что обычно приложение удаляет временный файл после закрытия дескриптора. В этом случае система может полностью избежать записи данных. В противном случае данные записываются после закрытия дескриптора" << endl;
  404.    
  405.     if (fileAttributes & FILE_ATTRIBUTE_VIRTUAL)
  406.         cout << "FILE_ATTRIBUTE_VIRTUAL: это значение зарезервировано для использования системой" << endl;
  407.  
  408.     waitPress();
  409. }
  410.  
  411.  
  412. void setFileAttributes() {
  413.  
  414.     size_t attributeNum;
  415.     TCHAR fileName[256];
  416.     DWORD fileAttributes;
  417.  
  418.     cout << endl <<  "Введите полное имя файла: ";
  419.     cin >> fileName;
  420.     cout << endl;
  421.  
  422.     fileAttributes = GetFileAttributes(fileName);
  423.  
  424.     do {
  425.         SubMenu attributeSelection;
  426.         attributeSelection.pushItem("FILE_ATTRIBUTE_ARCHIVE");
  427.         attributeSelection.pushItem("FILE_ATTRIBUTE_COMPRESSED");
  428.         attributeSelection.pushItem("FILE_ATTRIBUTE_DEVICE");
  429.         attributeSelection.pushItem("FILE_ATTRIBUTE_DIRECTORY");
  430.         attributeSelection.pushItem("FILE_ATTRIBUTE_ENCRYPTED");
  431.         attributeSelection.pushItem("FILE_ATTRIBUTE_HIDDEN");
  432.         attributeSelection.pushItem("FILE_ATTRIBUTE_INTEGRITY_STREAM");
  433.         attributeSelection.pushItem("FILE_ATTRIBUTE_NORMAL");
  434.         attributeSelection.pushItem("FILE_ATTRIBUTE_NOT_CONTENT_INDEXED");
  435.         attributeSelection.pushItem("FILE_ATTRIBUTE_NO_SCRUB_DATA");
  436.         attributeSelection.pushItem("FILE_ATTRIBUTE_OFFLINE");
  437.         attributeSelection.pushItem("FILE_ATTRIBUTE_READONLY");
  438.         attributeSelection.pushItem("FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS");
  439.         attributeSelection.pushItem("FILE_ATTRIBUTE_RECALL_ON_OPEN");
  440.         attributeSelection.pushItem("FILE_ATTRIBUTE_REPARSE_POINT");
  441.         attributeSelection.pushItem("FILE_ATTRIBUTE_SPARSE_FILE");
  442.         attributeSelection.pushItem("FILE_ATTRIBUTE_SYSTEM");
  443.         attributeSelection.pushItem("FILE_ATTRIBUTE_TEMPORARY");
  444.         attributeSelection.pushItem("FILE_ATTRIBUTE_VIRTUAL");
  445.         attributeSelection.pushItem("Выход");
  446.  
  447.  
  448.         do {
  449.  
  450.             attributeNum = attributeSelection.itemSelection();
  451.         } while (!isExit);
  452.  
  453.         isExit = false;
  454.  
  455.         switch (attributeNum) {
  456.  
  457.         case 1:
  458.             changeAttribute(FILE_ATTRIBUTE_ARCHIVE, fileAttributes, fileName);
  459.             waitPress();
  460.             break;
  461.  
  462.         case 2:
  463.             changeAttribute(FILE_ATTRIBUTE_COMPRESSED, fileAttributes, fileName);
  464.             waitPress();
  465.             break;
  466.  
  467.         case 3:
  468.             changeAttribute(FILE_ATTRIBUTE_DEVICE, fileAttributes, fileName);
  469.             waitPress();
  470.             break;
  471.  
  472.         case 4:
  473.             changeAttribute(FILE_ATTRIBUTE_DIRECTORY, fileAttributes, fileName);
  474.             waitPress();
  475.             break;
  476.  
  477.         case 5:
  478.             changeAttribute(FILE_ATTRIBUTE_ENCRYPTED, fileAttributes, fileName);
  479.             waitPress();
  480.             break;
  481.  
  482.         case 6:
  483.             changeAttribute(FILE_ATTRIBUTE_HIDDEN, fileAttributes, fileName);
  484.             waitPress();
  485.             break;
  486.  
  487.         case 7:
  488.             changeAttribute(FILE_ATTRIBUTE_NORMAL, fileAttributes, fileName);
  489.             waitPress();
  490.             break;
  491.  
  492.         case 8:
  493.             changeAttribute(FILE_ATTRIBUTE_INTEGRITY_STREAM, fileAttributes, fileName);
  494.             waitPress();
  495.             break;
  496.  
  497.         case 9:
  498.             changeAttribute(FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, fileAttributes, fileName);
  499.             waitPress();
  500.             break;
  501.  
  502.         case 10:
  503.             changeAttribute(FILE_ATTRIBUTE_NO_SCRUB_DATA, fileAttributes, fileName);
  504.             waitPress();
  505.             break;
  506.  
  507.         case 11:
  508.             changeAttribute(FILE_ATTRIBUTE_OFFLINE, fileAttributes, fileName);
  509.             waitPress();
  510.             break;
  511.  
  512.         case 12:
  513.             changeAttribute(FILE_ATTRIBUTE_READONLY, fileAttributes, fileName);
  514.             waitPress();
  515.             break;
  516.  
  517.         case 13:
  518.             changeAttribute(FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS, fileAttributes, fileName);
  519.             waitPress();
  520.             break;
  521.  
  522.         case 14:
  523.             changeAttribute(FILE_ATTRIBUTE_RECALL_ON_OPEN, fileAttributes, fileName);
  524.             waitPress();
  525.             break;
  526.  
  527.         case 15:
  528.             changeAttribute(FILE_ATTRIBUTE_REPARSE_POINT, fileAttributes, fileName);
  529.             waitPress();
  530.             break;
  531.  
  532.         case 16:
  533.             changeAttribute(FILE_ATTRIBUTE_SPARSE_FILE, fileAttributes, fileName);
  534.             waitPress();
  535.             break;
  536.  
  537.         case 17:
  538.             changeAttribute(FILE_ATTRIBUTE_SYSTEM, fileAttributes, fileName);
  539.             waitPress();
  540.             break;
  541.  
  542.         case 18:
  543.             changeAttribute(FILE_ATTRIBUTE_TEMPORARY, fileAttributes, fileName);
  544.             waitPress();
  545.             break;
  546.  
  547.         case 19:
  548.             changeAttribute(FILE_ATTRIBUTE_VIRTUAL, fileAttributes, fileName);
  549.             waitPress();
  550.             break;
  551.  
  552.         case 20:
  553.             isExit = true;
  554.             break;
  555.         }
  556.     } while (!isExit);
  557.  
  558.     isExit = false;
  559. }
  560.  
  561.  
  562. void changeAttribute(const long _ATTRIBUTE, DWORD& fileAttributes, TCHAR* fileName) {
  563.  
  564.     size_t attributeNum;
  565.  
  566.     SubMenu actionSelection;
  567.     actionSelection.pushItem("Вставить атрибут");
  568.     actionSelection.pushItem("Удалить атрибут");
  569.     actionSelection.pushItem("Отмена");
  570.  
  571.     do {
  572.  
  573.         attributeNum = actionSelection.itemSelection();
  574.     } while (!isExit);
  575.  
  576.     isExit = false;
  577.  
  578.     switch (attributeNum) {
  579.     case 1:
  580.         fileAttributes |= _ATTRIBUTE;
  581.         break;
  582.  
  583.     case 2:
  584.         fileAttributes &= ~_ATTRIBUTE;
  585.         break;
  586.  
  587.     case 3:
  588.         break;
  589.     }
  590.  
  591.     if (attributeNum != 3) {
  592.  
  593.         if (SetFileAttributes(fileName, fileAttributes))
  594.             if (attributeNum == 1)
  595.                 cout << endl << "Аттрибут успешно установлен" << endl;
  596.             else
  597.                 if (attributeNum == 2)
  598.                     cout << endl << "Аттрибут успешно удалён" << endl;
  599.         else
  600.             cout << endl << "Атрибут не был изменен" << endl;
  601.     }
  602.     else
  603.         cout << endl << "Операция отменена" << endl;
  604. }
  605.  
  606.  
  607. void getFileInformationByHandle() {
  608.  
  609.     HANDLE handle;
  610.     BY_HANDLE_FILE_INFORMATION fileInfo;
  611.     TCHAR fileName[256];
  612.  
  613.     cout << endl << "Введите полное имя файла: ";
  614.     cin >> fileName;
  615.     cout << endl;
  616.  
  617.     handle = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);
  618.  
  619.     if (handle != 0) {
  620.  
  621.         if (GetFileInformationByHandle(handle, &fileInfo)) {
  622.  
  623.             cout << "Серийный номер тома: " << fileInfo.dwVolumeSerialNumber << endl;
  624.             cout << "Аттрибуты файла: " << fileInfo.dwFileAttributes << endl;
  625.             cout << "Количество ссылок: " << fileInfo.nNumberOfLinks << endl;
  626.             cout << "Старшая часть размера файла: " << fileInfo.nFileSizeHigh << endl;
  627.             cout << "Младшая часть размера файла: " << fileInfo.nFileSizeLow << endl;
  628.             cout << "Старшая часть уникального идентификатора: " << fileInfo.nFileIndexHigh << endl;
  629.             cout << "Младшая часть уникального идентификатора: " << fileInfo.nFileIndexLow << endl;
  630.         }
  631.     }
  632.     else
  633.         cout << "Не удалось получить дескриптор файла" << endl;
  634.  
  635.     CloseHandle(handle);
  636.  
  637.     waitPress();
  638. }
  639.  
  640.  
  641. void getFileTime() {
  642.  
  643.     HANDLE handle;
  644.     TCHAR fileName[256];
  645.  
  646.     cout << endl << "Введите полное имя файла: ";
  647.     cin >> fileName;
  648.     cout << endl;
  649.  
  650.     handle = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
  651.  
  652.     if (handle != 0) {
  653.  
  654.         FILETIME fileCreatedTime, fileAccessedTime, fileWritedTime;
  655.         SYSTEMTIME fileCreatedSystemTime, fileAccessedSystemTime, fileWritedSystemTime;
  656.         TCHAR createdLocalDate[255], createdLocalTime[255], accessedLocalDate[255];
  657.         TCHAR accessedLocalTime[255], writedLocalDate[255], writedLocalTime[255];
  658.  
  659.         if (GetFileTime(handle, &fileCreatedTime, &fileAccessedTime, &fileWritedTime) != 0) {
  660.  
  661.             FileTimeToLocalFileTime(&fileCreatedTime, &fileCreatedTime);
  662.             FileTimeToLocalFileTime(&fileAccessedTime, &fileAccessedTime);
  663.             FileTimeToLocalFileTime(&fileWritedTime, &fileWritedTime);
  664.             FileTimeToSystemTime(&fileCreatedTime, &fileCreatedSystemTime);
  665.             FileTimeToSystemTime(&fileAccessedTime, &fileAccessedSystemTime);
  666.             FileTimeToSystemTime(&fileWritedTime, &fileWritedSystemTime);
  667.  
  668.             GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &fileCreatedSystemTime, NULL, createdLocalDate, 255);
  669.             GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &fileAccessedSystemTime, NULL, accessedLocalDate, 255);
  670.             GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &fileWritedSystemTime, NULL, writedLocalDate, 255);
  671.             GetTimeFormat(LOCALE_USER_DEFAULT, 0, &fileCreatedSystemTime, NULL, createdLocalTime, 255);
  672.             GetTimeFormat(LOCALE_USER_DEFAULT, 0, &fileAccessedSystemTime, NULL, accessedLocalTime, 255);
  673.             GetTimeFormat(LOCALE_USER_DEFAULT, 0, &fileWritedSystemTime, NULL, writedLocalTime, 255);
  674.  
  675.             cout << "Время создания: " << fileCreatedSystemTime.wDay << "." << fileCreatedSystemTime.wMonth << "."
  676.                 << fileCreatedSystemTime.wYear << " " << fileCreatedSystemTime.wHour << ":"
  677.                 << fileCreatedSystemTime.wMinute << "" << endl;
  678.             cout << "Последнее обращение: " << fileAccessedSystemTime.wDay << "." << fileAccessedSystemTime.wMonth << "."
  679.                 << fileAccessedSystemTime.wYear << " " << fileAccessedSystemTime.wHour << ":"
  680.                 << fileAccessedSystemTime.wMinute << "" << endl;
  681.             cout << "Последнее изменение: " << fileWritedSystemTime.wDay << "." << fileWritedSystemTime.wMonth << "."
  682.                 << fileWritedSystemTime.wYear << " " << fileWritedSystemTime.wHour << ":"
  683.                 << fileWritedSystemTime.wMinute << "" << endl;
  684.         }
  685.     }
  686.     else
  687.         cout << "Не удалось получить дескриптор файла" << endl;
  688.  
  689.     CloseHandle(handle);
  690.  
  691.     waitPress();
  692. }
  693.  
  694.  
  695. void setFileTime() {
  696.  
  697.     HANDLE handle;
  698.     TCHAR fileName[256];
  699.     FILETIME fileTime;
  700.     SYSTEMTIME systemTimeNow;
  701.  
  702.     cout << endl << "Введите полное имя файла: ";
  703.     cin >> fileName;
  704.     cout << endl;
  705.  
  706.     handle = CreateFile(fileName, FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING, 0, NULL);
  707.  
  708.     GetSystemTime(&systemTimeNow);
  709.     SystemTimeToFileTime(&systemTimeNow, &fileTime);
  710.  
  711.     if (SetFileTime(handle, &fileTime, NULL, NULL))
  712.         cout << "Время успешно установлено" << endl << systemTimeNow.wDay << "." << systemTimeNow.wMonth << "."
  713.         << systemTimeNow.wYear << " " << systemTimeNow.wHour + 3 << ":" << systemTimeNow.wMinute << "" << endl;
  714.     else
  715.         cout << "Время не удалось установить" << endl;
  716.  
  717.     CloseHandle(handle);
  718.  
  719.     waitPress();
  720. }
  721.  
  722.  
  723. void asyncCopyOfFile() {
  724.  
  725.     LARGE_INTEGER curPosIn;
  726.     DWORD startCopyTime, endCopyTime;
  727.     TCHAR source[257], destination[257];
  728.  
  729.     cout << endl << "Введите полное имя файла: ";
  730.     cin >> source;
  731.     cout << "Введите новое полное имя файла: ";
  732.     cin >> destination;
  733.     cout << "Введите кол-во перекрывающих операций ввода-вывода: ";
  734.     cin >> overlapOperationsCount;
  735.     cout << "Введите кол-во кластеров: ";
  736.     cin >> bufferCoef;
  737.     cout << endl << "Множитель: " << bufferCoef << endl;
  738.     numOfBytesToWrite *= bufferCoef;
  739.     cout << "Один блок: " << numOfBytesToWrite << " байт" << endl;
  740.  
  741.     bufferArray = new TCHAR*[overlapOperationsCount];
  742.     for (size_t i = 0; i < overlapOperationsCount; ++i)
  743.         bufferArray[i] = new TCHAR[numOfBytesToWrite];
  744.  
  745.     overlapR = new OVERLAPPED[overlapOperationsCount];
  746.     overlapW = new OVERLAPPED[overlapOperationsCount];
  747.  
  748.     originalFile = CreateFile(source, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING, NULL);
  749.     cpyFile = CreateFile(destination, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING, NULL);
  750.  
  751.     GetFileSizeEx(originalFile, &fileSize);
  752.  
  753.     cout << "Размер файла: " << fileSize.QuadPart << " байт" << endl;
  754.  
  755.     recordCount = (fileSize.QuadPart + numOfBytesToWrite - 1) / numOfBytesToWrite;
  756.     cout << "Количество блоков: " << recordCount << endl;
  757.  
  758.     startCopyTime = GetTickCount();
  759.     curPosIn.QuadPart = 0;
  760.  
  761.     for (size_t i = 0; i < overlapOperationsCount; ++i) {
  762.  
  763.         overlapR[i].hEvent = (HANDLE)i;
  764.         overlapW[i].hEvent = (HANDLE)i;
  765.         overlapR[i].Offset = curPosIn.LowPart;
  766.         overlapR[i].OffsetHigh = curPosIn.HighPart;
  767.  
  768.         if (curPosIn.QuadPart < fileSize.QuadPart)
  769.             ReadFileEx(originalFile, bufferArray[i], numOfBytesToWrite, &overlapR[i], asyncRead);
  770.  
  771.         curPosIn.QuadPart += (LONGLONG)numOfBytesToWrite;
  772.     }
  773.  
  774.     doneCount = 0;
  775.     while (doneCount < 2 * recordCount)
  776.         SleepEx(INFINITE, true);
  777.  
  778.     cout << endl << "Копирование успешно завершено!" << endl;
  779.  
  780.     endOfFile.QuadPart = fileSize.QuadPart;
  781.     endOfFile.HighPart = fileSize.HighPart;
  782.     SetFilePointerEx(cpyFile, endOfFile, 0, FILE_BEGIN);
  783.     SetEndOfFile(cpyFile);
  784.  
  785.     delete[] overlapR;
  786.     delete[] overlapW;
  787.     for (size_t i = 0; i < overlapOperationsCount; ++i)
  788.         delete[]bufferArray[i];
  789.     delete[] bufferArray;
  790.  
  791.     CloseHandle(originalFile);
  792.     CloseHandle(cpyFile);
  793.  
  794.     endCopyTime = GetTickCount();
  795.     cout << endl << "Время выполнения: " << endCopyTime - startCopyTime << " мс" << endl;
  796.  
  797.     waitPress();
  798. }
  799.  
  800.  
  801. VOID WINAPI asyncWrite(DWORD Code, DWORD nBytes, LPOVERLAPPED lpOv) {
  802.  
  803.     LARGE_INTEGER curPosIn;
  804.     DWORD i = (DWORD)(lpOv->hEvent);
  805.  
  806.     ++doneCount;
  807.  
  808.     curPosIn.LowPart = overlapR[i].Offset;
  809.     curPosIn.HighPart = overlapR[i].OffsetHigh;
  810.  
  811.     if (curPosIn.QuadPart < fileSize.QuadPart)
  812.         ReadFileEx(originalFile, bufferArray[i], numOfBytesToWrite, &overlapR[i], asyncRead);
  813. }
  814.  
  815.  
  816. VOID WINAPI asyncRead(DWORD Code, DWORD nBytes, LPOVERLAPPED lpOv) {
  817.  
  818.     LARGE_INTEGER curPosIn, curPosOut;
  819.     DWORD i = (DWORD)(lpOv->hEvent);
  820.  
  821.     ++doneCount;
  822.  
  823.     curPosIn.LowPart = overlapR[i].Offset;
  824.     curPosIn.HighPart = overlapR[i].OffsetHigh;
  825.     curPosOut.QuadPart = (curPosIn.QuadPart / numOfBytesToWrite)*numOfBytesToWrite;
  826.  
  827.     overlapW[i].Offset = curPosOut.LowPart;
  828.     overlapW[i].OffsetHigh = curPosOut.HighPart;
  829.  
  830.     WriteFileEx(cpyFile, bufferArray[i], numOfBytesToWrite, &overlapW[i], asyncWrite);
  831.     curPosIn.QuadPart += numOfBytesToWrite * (LONGLONG)overlapOperationsCount;
  832.  
  833.     overlapR[i].Offset = curPosIn.LowPart;
  834.     overlapR[i].OffsetHigh = curPosIn.HighPart;
  835. }
  836.  
  837. ///////////////////////////////////////////////////////////// MenuLib.h
  838.  
  839. #pragma once
  840.  
  841. #include <vector>
  842. #include <iostream>
  843. #include <conio.h>
  844. #include <Windows.h>
  845. #include <tchar.h>
  846.  
  847. using namespace std;
  848.  
  849. void exit();
  850. void waitPress();
  851.  
  852. struct MenuItem {
  853.  
  854.     void (*itemFun) ();
  855.     string itemName;
  856. };
  857.  
  858. class MainMenu {
  859.  
  860.     vector<MenuItem> items;
  861.  
  862.     size_t currentMenuItem;
  863.     char input;
  864.  
  865. public:
  866.  
  867.     MainMenu();
  868.     MenuItem& itemSelection();
  869.     void pushItem(string, void (*itemFun) ());
  870. };
  871.  
  872. class SubMenu {
  873.  
  874.     vector<string> items;
  875.  
  876.     size_t currentMenuItem;
  877.     char input;
  878.  
  879. public:
  880.  
  881.     SubMenu();
  882.     int itemSelection();
  883.     void pushItem(string);
  884. };
  885.  
  886. ///////////////////////////////////////////////////////////// MenuLib.cpp
  887.  
  888. #include "MenuLib.h"
  889.  
  890.  
  891. extern bool isExit = false;
  892.  
  893.  
  894. void exit() {
  895.  
  896.     isExit = true;
  897. }
  898.  
  899.  
  900. void waitPress() {
  901.  
  902.     cout << "Нажмите любую клавишу...";
  903.     _getch();
  904. }
  905.  
  906.  
  907. SubMenu::SubMenu() {
  908.     currentMenuItem = 1;
  909.     input = '0';
  910. }
  911.  
  912.  
  913. int SubMenu::itemSelection() {
  914.  
  915.     do {
  916.  
  917.         system("cls");
  918.         cout << endl << "Выберите один пункт меню и нажмите Enter" << endl;
  919.  
  920.         for (size_t item = 1; item <= items.size(); ++item) {
  921.  
  922.             if (item == currentMenuItem)
  923.                 cout << "<< ";
  924.             else
  925.                 cout << "   ";
  926.  
  927.             cout << items.at(item - 1);
  928.  
  929.             if (item == currentMenuItem)
  930.                 cout << " >>";
  931.             else
  932.                 cout << "   ";
  933.  
  934.             cout << endl;
  935.         }
  936.  
  937.         input = _getch();
  938.  
  939.         if (input == 'w' || input == 72) // UP
  940.             --currentMenuItem;
  941.         if (input == 's' || input == 80) // DOWN
  942.             ++currentMenuItem;
  943.         if (input == 13) // ENTER
  944.             isExit = true;
  945.  
  946.         if (currentMenuItem > items.size())
  947.             currentMenuItem = 1;
  948.         if (currentMenuItem < 1)
  949.             currentMenuItem = items.size();
  950.  
  951.     } while (!isExit);
  952.  
  953.     return currentMenuItem;
  954. }
  955.  
  956.  
  957. void SubMenu::pushItem(string name) {
  958.  
  959.     items.push_back(name);
  960. }
  961.  
  962.  
  963. MainMenu::MainMenu() {
  964.  
  965.     currentMenuItem = 1;
  966.     input = '0';
  967. }
  968.  
  969.  
  970. MenuItem& MainMenu::itemSelection() {
  971.  
  972.     do {
  973.         system("cls");
  974.  
  975.         for (size_t item = 1; item <= items.size(); ++item) {
  976.  
  977.             if (item == currentMenuItem)
  978.                 cout << "<< ";
  979.             else
  980.                 cout << "   ";
  981.  
  982.             cout << items.at(item - 1).itemName;
  983.  
  984.             if (item == currentMenuItem)
  985.                 cout << " >>";
  986.             else
  987.                 cout << "   ";
  988.  
  989.             cout << endl;
  990.         }
  991.  
  992.         input = _getch();
  993.  
  994.         if (input == 'w' || input == 72) // UP
  995.             --currentMenuItem;
  996.         if (input == 's' || input == 80) // DOWN
  997.             ++currentMenuItem;
  998.  
  999.         if (currentMenuItem > items.size())
  1000.             currentMenuItem = 1;
  1001.         if (currentMenuItem < 1)
  1002.             currentMenuItem = items.size();
  1003.  
  1004.     } while (input != 27 && input != 13); // ESCAPE && ENTER
  1005.  
  1006.     if (input == 27)
  1007.         return items.back();
  1008.     else
  1009.         return items.at(currentMenuItem - 1);
  1010. }
  1011.  
  1012.  
  1013. void MainMenu::pushItem(string name, void(*itemFun) ()) {
  1014.  
  1015.     MenuItem pushItem;
  1016.     pushItem.itemName = name;
  1017.     pushItem.itemFun = itemFun;
  1018.  
  1019.     items.push_back(pushItem);
  1020. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement