Guest User

os3

a guest
Nov 14th, 2019
126
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #define MAX_LEN 255
  6.  
  7. //Функция вывода списка дисков
  8. void getDrives() {
  9. DWORD n = GetLogicalDrives();
  10. char d = 'A';
  11. if (!n)
  12. printf("Нет доступных дисков");
  13. else
  14. printf("Доступные диски:\n");
  15. while (n > 0){
  16. if (n & 1)
  17. printf("%c ", d);
  18. n = n >> 1;
  19. d++;
  20. }
  21. printf("\n");
  22. }
  23.  
  24. void getDriveInfo() {
  25.  
  26. char drivePath[MAX_LEN];
  27. printf("Введите диск, о котором хотите получить информацию\nНапример: \"C:\\\"\n");
  28. if (fgets(drivePath, MAX_LEN, stdin)) {
  29. fflush(stdin);
  30. drivePath[strlen(drivePath) - 1] = '\0';
  31. UINT driveType = GetDriveTypeA(drivePath);
  32. switch (driveType){
  33. case DRIVE_UNKNOWN:
  34. printf("Не удалось определить тип диска\n");
  35. break;
  36. case DRIVE_NO_ROOT_DIR:
  37. printf("Неверно введена корневая директория\n");
  38. break;
  39. case DRIVE_REMOVABLE:
  40. printf("Съёмный диск\n");
  41. break;
  42. case DRIVE_FIXED:
  43. printf("Локальный диск\n");
  44. break;
  45. case DRIVE_REMOTE:
  46. printf("Удаленный (сетевой) диск\n");
  47. break;
  48. case DRIVE_CDROM:
  49. printf("Дисковод\n");
  50. break;
  51. case DRIVE_RAMDISK:
  52. printf("RAM-диск\n");
  53. break;
  54. }
  55. LPSTR volName = (LPSTR)malloc(sizeof *volName * MAX_LEN);
  56. LPDWORD compLength = (LPDWORD)malloc(sizeof *compLength);
  57. LPDWORD fileFlags = (LPDWORD)malloc(sizeof *fileFlags);
  58. LPSTR fileSystem = (LPSTR)malloc(sizeof *fileSystem * MAX_LEN);
  59. if (GetVolumeInformationA(drivePath, volName, MAX_LEN, NULL, compLength, fileFlags, fileSystem, MAX_LEN)){
  60. printf("Имя тома - %s\n", volName);
  61. printf("Файловая система - %s\n", fileSystem);
  62. printf("Максимальная длина компонента имени файла - %ld\n", *compLength);
  63. if (*fileFlags & FILE_CASE_PRESERVED_NAMES)
  64. printf("Поддерживает сохранение регистра имен файлов при хранении\n");
  65. if (*fileFlags & FILE_CASE_SENSITIVE_SEARCH)
  66. printf("Поддерживает поиск, чувствительный к регистру\n");
  67. if (*fileFlags & FILE_FILE_COMPRESSION)
  68. printf("Поддерживает сжатие файлов\n");
  69. if (*fileFlags & FILE_NAMED_STREAMS)
  70. printf("Поддерживает именованные потоки\n");
  71. if (*fileFlags & FILE_PERSISTENT_ACLS)
  72. printf("Сохраняет и обеспечивает соблюдение ACL\n");
  73. if (*fileFlags & FILE_READ_ONLY_VOLUME)
  74. printf("Только для чтения\n");
  75. if (*fileFlags & FILE_SEQUENTIAL_WRITE_ONCE)
  76. printf("Поддерживает одиночную последовательную запись\n");
  77. if (*fileFlags & FILE_SUPPORTS_ENCRYPTION)
  78. printf("Поддерживает шифрование\n");
  79. if (*fileFlags & FILE_SUPPORTS_EXTENDED_ATTRIBUTES)
  80. printf("Поддерживает расширенные атрибуты\n");
  81. if (*fileFlags & FILE_SUPPORTS_HARD_LINKS)
  82. printf("Поддерживает жесткие ссылки\n");
  83. if (*fileFlags & FILE_SUPPORTS_OBJECT_IDS)
  84. printf("Поддерживает идентификаторы объектов\n");
  85. if (*fileFlags & FILE_SUPPORTS_OPEN_BY_FILE_ID)
  86. printf("Поддерживает открытие по FileID\n");
  87. if (*fileFlags & FILE_SUPPORTS_REPARSE_POINTS)
  88. printf("Поддерживает точки повторной обработки\n");
  89. if (*fileFlags & FILE_SUPPORTS_SPARSE_FILES)
  90. printf("Поддерживает разреженные файлы\n");
  91. if (*fileFlags & FILE_SUPPORTS_TRANSACTIONS)
  92. printf("Поддерживает транзакции\n");
  93. if (*fileFlags & FILE_SUPPORTS_USN_JOURNAL)
  94. printf("Поддерживает журнал USN\n");
  95. if (*fileFlags & FILE_UNICODE_ON_DISK)
  96. printf("Поддерживает Unicode в именах файлов\n");
  97. if (*fileFlags & FILE_VOLUME_IS_COMPRESSED)
  98. printf("Том сжат\n");
  99. if (*fileFlags & FILE_VOLUME_QUOTAS)
  100. printf("Поддерживает квоты\n");
  101. }
  102. else {
  103. DWORD err = GetLastError();
  104. printf("Ошибка получения информации о диске: код %ld", err);
  105. }
  106. free(volName);
  107. free(compLength);
  108. free(fileFlags);
  109. free(fileSystem);
  110.  
  111. PULARGE_INTEGER freeSpace = (PULARGE_INTEGER)malloc(sizeof *freeSpace);
  112. PULARGE_INTEGER totalSpace = (PULARGE_INTEGER)malloc(sizeof *totalSpace);
  113. if (GetDiskFreeSpaceExA(drivePath, freeSpace, totalSpace, NULL)) {
  114. printf("Свободное место на диске - %I64u из %I64u байт\n", freeSpace->QuadPart, totalSpace->QuadPart);
  115. }
  116. else {
  117. DWORD err = GetLastError();
  118. printf("Ошибка при получении информации о свободном месте: код %ld", err);
  119. }
  120. free(freeSpace);
  121. free(totalSpace);
  122. }
  123. else {
  124. fflush(stdin);
  125. printf("Ошибка при считывании ввода");
  126. }
  127.  
  128. }
  129.  
  130. void dirCreateDelete() {
  131. int flag = 1;
  132. do {
  133. printf("1 - Создание каталога\n2 - Удаление каталога\n3 - Возврат в меню\n");
  134. char c = getchar();
  135. fflush(stdin);
  136. char dirPath[MAX_LEN];
  137. switch (c) {
  138. case '1':
  139. printf("Введите путь к создаваемому каталогу\nНапример: \"C:\\Tools\\NewDir\" \".\\NewDir\" (создает в текущем каталоге)\n");
  140. if (fgets(dirPath, MAX_LEN, stdin)){
  141. fflush(stdin);
  142. dirPath[strlen(dirPath) - 1] = '\0';
  143. if(!CreateDirectory(dirPath, NULL)) {
  144. DWORD err = GetLastError();
  145. if (err == ERROR_ALREADY_EXISTS)
  146. printf("Ошибка: каталог уже существует\n");
  147. else if (err == ERROR_PATH_NOT_FOUND)
  148. printf("Ошибка: путь к каталогу не существует\n");
  149. else
  150. printf("Ошибка: код ошибки %ld\n", err);
  151. }
  152. else
  153. printf ("Каталог создан\n");
  154. }
  155. else {
  156. fflush(stdin);
  157. printf("Ошибка при считывании ввода");
  158. }
  159. break;
  160. case '2':
  161. printf("Введите путь к удаляемому каталогу\nНапример: \"C:\\Tools\\Dir\" \".\\Dir\" (удаляет в текущем каталоге)\n");
  162. if (fgets(dirPath, MAX_LEN, stdin)){
  163. fflush(stdin);
  164. dirPath[strlen(dirPath) - 1] = '\0';
  165. if (!RemoveDirectory(dirPath)) {
  166. DWORD err = GetLastError();
  167. printf("Ошибка: код ошибки %ld\n", err);
  168. }
  169. else
  170. printf("Каталог удален\n");
  171. }
  172. else {
  173. fflush(stdin);
  174. printf("Ошибка при считывании ввода");
  175. }
  176. break;
  177. case '3':
  178. printf("Возвращаемся в меню\n");
  179. flag = 0;
  180. break;
  181. default:
  182. printf("Ошибка ввода, попробуйте еще раз\n");
  183. }
  184. } while (flag);
  185.  
  186. }
  187.  
  188. void fileCreate() {
  189. printf("Введите путь к создаваемому файлу\nНапример: \"C:\\Tools\\NewFile\" \".\\NewFile\" (в текущем каталоге)\n");
  190. char filePath[MAX_LEN];
  191. if (fgets(filePath, MAX_LEN, stdin)){
  192. fflush(stdin);
  193. filePath[strlen(filePath) - 1] = '\0';
  194. SECURITY_ATTRIBUTES secAttr = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
  195. HANDLE fileHandle = CreateFile(filePath, GENERIC_READ | GENERIC_WRITE, 0, &secAttr, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
  196. if (fileHandle == INVALID_HANDLE_VALUE) {
  197. DWORD err = GetLastError();
  198. if (err == ERROR_FILE_EXISTS)
  199. printf("Ошибка: файл уже существует\n");
  200. else if (err == ERROR_PATH_NOT_FOUND)
  201. printf("Ошибка: путь к файлу не существует\n");
  202. else
  203. printf("Ошибка: код ошибки %ld\n", err);
  204. }
  205. else {
  206. printf("Файл создан\n");
  207. CloseHandle(fileHandle);
  208. }
  209. }
  210. else {
  211. fflush(stdin);
  212. printf("Ошибка при считывании ввода");
  213. }
  214. }
  215.  
  216. void fileCopyMove() {
  217. int flag = 1;
  218. do {
  219. printf("1 - Копирование файла\n2 - Перемещение файла\n3 - Возврат в меню\n");
  220. char c = getchar();
  221. fflush(stdin);
  222. char exFilePath[MAX_LEN];
  223. char newFilePath[MAX_LEN];
  224. switch (c) {
  225. case '1':
  226. printf("Введите путь к копируемому файлу\nНапример: \"C:\\Tools\\File\" \".\\File\" (в текущем каталоге)\n");
  227. if (fgets(exFilePath, MAX_LEN, stdin)){
  228. fflush(stdin);
  229. exFilePath[strlen(exFilePath) - 1] = '\0';
  230. printf("Введите путь к новому файлу\nНапример: \"C:\\Tools\\NewFile\" \".\\NewFile\" (в текущем каталоге)\n");
  231. if (fgets(newFilePath, MAX_LEN, stdin)) {
  232. fflush(stdin);
  233. newFilePath[strlen(newFilePath) - 1] = '\0';
  234. if (!CopyFile(exFilePath, newFilePath, TRUE)){
  235. DWORD err = GetLastError();
  236. if (err == ERROR_FILE_EXISTS) {
  237. printf("Файл с таким именем уже существует. Перезаписать его?\n1 - да, 2 - нет\n");
  238. char c1 = getchar();
  239. fflush(stdin);
  240. int flag1 = 1;
  241. do {
  242. switch(c1) {
  243. case '1':
  244. CopyFile(exFilePath, newFilePath, FALSE);
  245. printf("Файл перезаписан\n");
  246. flag1 = 0;
  247. break;
  248. case '2':
  249. printf("Отмена копирования\n");
  250. flag1 = 0;
  251. break;
  252. default:
  253. printf("Ошибка ввода, попробуйте еще раз\n");
  254. }
  255. } while (flag1);
  256. }
  257. else if (err == ERROR_PATH_NOT_FOUND)
  258. printf("Ошибка: путь к файлу не существует\n");
  259. else if (err == ERROR_FILE_NOT_FOUND)
  260. printf("Ошибка: исходный файл не существует\n");
  261. else
  262. printf("Ошибка: код ошибки: %ld\n", err);
  263. }
  264. else
  265. printf("Файл скопирован\n");
  266. }
  267. else {
  268. fflush(stdin);
  269. printf("Ошибка при считывании ввода");
  270. }
  271. }
  272. else {
  273. fflush(stdin);
  274. printf("Ошибка при считывании ввода");
  275. }
  276. break;
  277. case '2':
  278. printf("Введите путь к перемещаемому файлу или директории\nНапример: \"C:\\Tools\\File\" \".\\File\" (в текущем каталоге)\n");
  279. if (fgets(exFilePath, MAX_LEN, stdin)){
  280. fflush(stdin);
  281. exFilePath[strlen(exFilePath) - 1] = '\0';
  282. printf("Введите путь к новому файлу или директории\nНапример: \"C:\\Tools\\NewFile\" \".\\NewFile\" (в текущем каталоге)\n");
  283. if (fgets(newFilePath, MAX_LEN, stdin)) {
  284. fflush(stdin);
  285. newFilePath[strlen(newFilePath) - 1] = '\0';
  286. if (!MoveFile(exFilePath, newFilePath)){
  287. DWORD err = GetLastError();
  288. if (err == ERROR_ALREADY_EXISTS) {
  289. printf("Файл/директория с таким именем уже существует. Перезаписать его?\n1 - да, 2 - нет\n");
  290. char c1 = getchar();
  291. fflush(stdin);
  292. int flag1 = 1;
  293. do {
  294. switch(c1) {
  295. case '1':
  296. MoveFileEx(exFilePath, newFilePath, MOVEFILE_REPLACE_EXISTING);
  297. printf("Файл/директория перезаписан(-а)\n");
  298. flag1 = 0;
  299. break;
  300. case '2':
  301. printf("Отмена перемещения\n");
  302. flag1 = 0;
  303. break;
  304. default:
  305. printf("Ошибка ввода, попробуйте еще раз\n");
  306. }
  307. } while (flag1);
  308. }
  309. else if (err == ERROR_PATH_NOT_FOUND)
  310. printf("Ошибка: путь к файлу не существует\n");
  311. else if (err == ERROR_FILE_NOT_FOUND)
  312. printf("Ошибка: исходный файл не существует\n");
  313. else
  314. printf("Ошибка: код ошибки: %ld\n", err);
  315. }
  316. else
  317. printf("Файл/директория перемещен(-а)\n");
  318. }
  319. else {
  320. fflush(stdin);
  321. printf("Ошибка при считывании ввода");
  322. }
  323. }
  324. else {
  325. fflush(stdin);
  326. printf("Ошибка при считывании ввода");
  327. }
  328. break;
  329. case '3':
  330. printf("Возвращаемся в меню\n");
  331. flag = 0;
  332. break;
  333. default:
  334. printf("Ошибка ввода, попробуйте еще раз\n");
  335. }
  336. } while (flag);
  337.  
  338. }
  339.  
  340. void fileAttr() {
  341. printf("Введите путь к файлу, о котором хотите получить информацию\nНапример: \"C:\\Tools\\File\" \".\\File\" (в текущем каталоге)\n");
  342. char filePath[MAX_LEN];
  343. if (fgets(filePath, MAX_LEN, stdin)){
  344. fflush(stdin);
  345. filePath[strlen(filePath) - 1] = '\0';
  346. DWORD fileAttr = GetFileAttributesA(filePath);
  347. if (fileAttr == INVALID_FILE_ATTRIBUTES) {
  348. DWORD err = GetLastError();
  349. if (err == ERROR_FILE_NOT_FOUND)
  350. printf("Ошибка: файл не существует\n");
  351. else if (err == ERROR_PATH_NOT_FOUND)
  352. printf("Ошибка: путь к файлу не существует\n");
  353. else
  354. printf("Ошибка: код ошибки %ld\n", err);
  355. }
  356. else if (fileAttr == FILE_ATTRIBUTE_NORMAL) {
  357. printf("Файл не имеет особых атрибутов\n");
  358. }
  359. else {
  360. if (fileAttr & FILE_ATTRIBUTE_ARCHIVE)
  361. printf("Архивный файл\n");
  362. if (fileAttr & FILE_ATTRIBUTE_HIDDEN)
  363. printf("Скрытый файл\n");
  364. if (fileAttr & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)
  365. printf("Файл не индексируется\n");
  366. if (fileAttr & FILE_ATTRIBUTE_OFFLINE)
  367. printf("Оффлайн файл\n");
  368. if (fileAttr & FILE_ATTRIBUTE_READONLY)
  369. printf("Файл только для чтения\n");
  370. if (fileAttr & FILE_ATTRIBUTE_SYSTEM)
  371. printf("Системный файл\n");
  372. if (fileAttr & FILE_ATTRIBUTE_TEMPORARY)
  373. printf("Временный файл\n");
  374. }
  375.  
  376. HANDLE fileHandle = CreateFile(filePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  377. if (fileHandle == INVALID_HANDLE_VALUE) {
  378. DWORD err = GetLastError();
  379. if (err == ERROR_FILE_NOT_FOUND)
  380. printf("Ошибка: файл не существует\n");
  381. else if (err == ERROR_PATH_NOT_FOUND)
  382. printf("Ошибка: путь к файлу не существует\n");
  383. else
  384. printf("Ошибка: код ошибки %ld\n", err);
  385. }
  386. else {
  387. LPFILETIME createTime = (LPFILETIME)malloc(sizeof *createTime);
  388. LPFILETIME lastAccTime = (LPFILETIME)malloc(sizeof *lastAccTime);
  389. LPFILETIME lastWriteTime = (LPFILETIME)malloc(sizeof *lastWriteTime);
  390. if (!GetFileTime(fileHandle, createTime, lastAccTime, lastWriteTime))
  391. printf("Ошибка: код ошибки %ld\n", GetLastError());
  392. else {
  393. LPSYSTEMTIME sysTime = (LPSYSTEMTIME)malloc(sizeof *sysTime);
  394. if (!FileTimeToSystemTime(createTime, sysTime))
  395. printf("Ошибка: код ошибки %ld\n", GetLastError());
  396. else
  397. printf("Дата создания файла: %d/%d/%d %d:%d:%d\n", sysTime->wYear, sysTime->wMonth, sysTime->wDay, sysTime->wHour, sysTime->wMinute, sysTime->wSecond);
  398. if (!FileTimeToSystemTime(lastAccTime, sysTime))
  399. printf("Ошибка: код ошибки %ld\n", GetLastError());
  400. else
  401. printf("Дата последнего доступа к файлу: %d/%d/%d %d:%d:%d\n", sysTime->wYear, sysTime->wMonth, sysTime->wDay, sysTime->wHour, sysTime->wMinute, sysTime->wSecond);
  402. if (!FileTimeToSystemTime(lastWriteTime, sysTime))
  403. printf("Ошибка: код ошибки %ld\n", GetLastError());
  404. else
  405. printf("Дата изменения файла: %d/%d/%d %d:%d:%d\n", sysTime->wYear, sysTime->wMonth, sysTime->wDay, sysTime->wHour, sysTime->wMinute, sysTime->wSecond);
  406. free(sysTime);
  407. }
  408. free(createTime);
  409. free(lastAccTime);
  410. free(lastWriteTime);
  411. CloseHandle(fileHandle);
  412.  
  413. printf("Введите (через пробел) номера атрибутов, которые хотите добавить к файлу (или убрать, если он уже есть у файла):\n"
  414. "1 - архивный файл, 2 - скрытый файл, 3 - неиндексируемый файл, 4 - оффлайн файл, 5 - файл только для чтения, 6 - системный файл, 7 - временный файл\n");
  415. char numbers[MAX_LEN];
  416. if (fgets(numbers, MAX_LEN, stdin)) {
  417. fflush(stdin);
  418. numbers[strlen(numbers) - 1] = '\0';
  419. const int attr[8] = { 0, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, FILE_ATTRIBUTE_OFFLINE,
  420. FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_TEMPORARY };
  421. for (int i = 0; numbers[i]; ++i) {
  422. if ((numbers[i] <= '7') && (numbers[i] >= '1')){
  423. if (attr[numbers[i] - '0'] & fileAttr)
  424. fileAttr = fileAttr & (~attr[numbers[i] - '0']);
  425. else
  426. fileAttr = fileAttr | attr[numbers[i] - '0'];
  427. }
  428. }
  429. SetFileAttributesA(filePath, fileAttr);
  430. }
  431. else {
  432. fflush(stdin);
  433. printf("Ошибка при считывании ввода");
  434. }
  435. fileHandle = CreateFile(filePath, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  436. LPSYSTEMTIME sysTime = (LPSYSTEMTIME)malloc(sizeof *sysTime);
  437. GetSystemTime(sysTime);
  438. LPFILETIME fileTime = (LPFILETIME)malloc(sizeof *fileTime);
  439. SystemTimeToFileTime(sysTime, fileTime);
  440. if(!SetFileTime(fileHandle, fileTime, fileTime, fileTime))
  441. printf("Ошибка: код ошибки %ld\n", GetLastError());
  442. CloseHandle(fileHandle);
  443. free(fileTime);
  444. free(sysTime);
  445. }
  446. }
  447. else {
  448. fflush(stdin);
  449. printf("Ошибка при считывании ввода");
  450. }
  451. }
  452.  
  453. int main()
  454. {
  455. int flag = 1;
  456. system("chcp 65001");
  457. do {
  458. printf("Добро пожаловать! Выберите действие:\n1 - Вывод списка дисков\n2 - Информация о выбранном диске\n"
  459. "3 - Создание и удаление каталогов\n4 - Создание файлов в новых каталогах\n"
  460. "5 - Копирование и перемещение файлов между каталогами\n6 - Анализ и изменение атрибутов файлов\n7 - Выход\n");
  461. char c = getchar();
  462. fflush(stdin);
  463. switch (c){
  464. case '1':
  465. getDrives();
  466. break;
  467. case '2':
  468. getDriveInfo();
  469. break;
  470. case '3':
  471. dirCreateDelete();
  472. break;
  473. case '4':
  474. fileCreate();
  475. break;
  476. case '5':
  477. fileCopyMove();
  478. break;
  479. case '6':
  480. fileAttr();
  481. break;
  482. case '7':
  483. printf("Выход из программы\n");
  484. flag = 0;
  485. break;
  486. default:
  487. printf("Неправильный ввод, попробуйте еще раз\n");
  488. }
  489.  
  490. } while (flag);
  491. return 0;
  492. }
RAW Paste Data