Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define MAX_LEN 255
- //Функция вывода списка дисков
- void getDrives() {
- DWORD n = GetLogicalDrives();
- char d = 'A';
- if (!n)
- printf("Нет доступных дисков");
- else
- printf("Доступные диски:\n");
- while (n > 0){
- if (n & 1)
- printf("%c ", d);
- n = n >> 1;
- d++;
- }
- printf("\n");
- }
- void getDriveInfo() {
- char drivePath[MAX_LEN];
- printf("Введите диск, о котором хотите получить информацию\nНапример: \"C:\\\"\n");
- if (fgets(drivePath, MAX_LEN, stdin)) {
- fflush(stdin);
- drivePath[strlen(drivePath) - 1] = '\0';
- UINT driveType = GetDriveTypeA(drivePath);
- switch (driveType){
- case DRIVE_UNKNOWN:
- printf("Не удалось определить тип диска\n");
- break;
- case DRIVE_NO_ROOT_DIR:
- printf("Неверно введена корневая директория\n");
- break;
- case DRIVE_REMOVABLE:
- printf("Съёмный диск\n");
- break;
- case DRIVE_FIXED:
- printf("Локальный диск\n");
- break;
- case DRIVE_REMOTE:
- printf("Удаленный (сетевой) диск\n");
- break;
- case DRIVE_CDROM:
- printf("Дисковод\n");
- break;
- case DRIVE_RAMDISK:
- printf("RAM-диск\n");
- break;
- }
- LPSTR volName = (LPSTR)malloc(sizeof *volName * MAX_LEN);
- LPDWORD compLength = (LPDWORD)malloc(sizeof *compLength);
- LPDWORD fileFlags = (LPDWORD)malloc(sizeof *fileFlags);
- LPSTR fileSystem = (LPSTR)malloc(sizeof *fileSystem * MAX_LEN);
- if (GetVolumeInformationA(drivePath, volName, MAX_LEN, NULL, compLength, fileFlags, fileSystem, MAX_LEN)){
- printf("Имя тома - %s\n", volName);
- printf("Файловая система - %s\n", fileSystem);
- printf("Максимальная длина компонента имени файла - %ld\n", *compLength);
- if (*fileFlags & FILE_CASE_PRESERVED_NAMES)
- printf("Поддерживает сохранение регистра имен файлов при хранении\n");
- if (*fileFlags & FILE_CASE_SENSITIVE_SEARCH)
- printf("Поддерживает поиск, чувствительный к регистру\n");
- if (*fileFlags & FILE_FILE_COMPRESSION)
- printf("Поддерживает сжатие файлов\n");
- if (*fileFlags & FILE_NAMED_STREAMS)
- printf("Поддерживает именованные потоки\n");
- if (*fileFlags & FILE_PERSISTENT_ACLS)
- printf("Сохраняет и обеспечивает соблюдение ACL\n");
- if (*fileFlags & FILE_READ_ONLY_VOLUME)
- printf("Только для чтения\n");
- if (*fileFlags & FILE_SEQUENTIAL_WRITE_ONCE)
- printf("Поддерживает одиночную последовательную запись\n");
- if (*fileFlags & FILE_SUPPORTS_ENCRYPTION)
- printf("Поддерживает шифрование\n");
- if (*fileFlags & FILE_SUPPORTS_EXTENDED_ATTRIBUTES)
- printf("Поддерживает расширенные атрибуты\n");
- if (*fileFlags & FILE_SUPPORTS_HARD_LINKS)
- printf("Поддерживает жесткие ссылки\n");
- if (*fileFlags & FILE_SUPPORTS_OBJECT_IDS)
- printf("Поддерживает идентификаторы объектов\n");
- if (*fileFlags & FILE_SUPPORTS_OPEN_BY_FILE_ID)
- printf("Поддерживает открытие по FileID\n");
- if (*fileFlags & FILE_SUPPORTS_REPARSE_POINTS)
- printf("Поддерживает точки повторной обработки\n");
- if (*fileFlags & FILE_SUPPORTS_SPARSE_FILES)
- printf("Поддерживает разреженные файлы\n");
- if (*fileFlags & FILE_SUPPORTS_TRANSACTIONS)
- printf("Поддерживает транзакции\n");
- if (*fileFlags & FILE_SUPPORTS_USN_JOURNAL)
- printf("Поддерживает журнал USN\n");
- if (*fileFlags & FILE_UNICODE_ON_DISK)
- printf("Поддерживает Unicode в именах файлов\n");
- if (*fileFlags & FILE_VOLUME_IS_COMPRESSED)
- printf("Том сжат\n");
- if (*fileFlags & FILE_VOLUME_QUOTAS)
- printf("Поддерживает квоты\n");
- }
- else {
- DWORD err = GetLastError();
- printf("Ошибка получения информации о диске: код %ld", err);
- }
- free(volName);
- free(compLength);
- free(fileFlags);
- free(fileSystem);
- PULARGE_INTEGER freeSpace = (PULARGE_INTEGER)malloc(sizeof *freeSpace);
- PULARGE_INTEGER totalSpace = (PULARGE_INTEGER)malloc(sizeof *totalSpace);
- if (GetDiskFreeSpaceExA(drivePath, freeSpace, totalSpace, NULL)) {
- printf("Свободное место на диске - %I64u из %I64u байт\n", freeSpace->QuadPart, totalSpace->QuadPart);
- }
- else {
- DWORD err = GetLastError();
- printf("Ошибка при получении информации о свободном месте: код %ld", err);
- }
- free(freeSpace);
- free(totalSpace);
- }
- else {
- fflush(stdin);
- printf("Ошибка при считывании ввода");
- }
- }
- void dirCreateDelete() {
- int flag = 1;
- do {
- printf("1 - Создание каталога\n2 - Удаление каталога\n3 - Возврат в меню\n");
- char c = getchar();
- fflush(stdin);
- char dirPath[MAX_LEN];
- switch (c) {
- case '1':
- printf("Введите путь к создаваемому каталогу\nНапример: \"C:\\Tools\\NewDir\" \".\\NewDir\" (создает в текущем каталоге)\n");
- if (fgets(dirPath, MAX_LEN, stdin)){
- fflush(stdin);
- dirPath[strlen(dirPath) - 1] = '\0';
- if(!CreateDirectory(dirPath, NULL)) {
- DWORD err = GetLastError();
- if (err == ERROR_ALREADY_EXISTS)
- printf("Ошибка: каталог уже существует\n");
- else if (err == ERROR_PATH_NOT_FOUND)
- printf("Ошибка: путь к каталогу не существует\n");
- else
- printf("Ошибка: код ошибки %ld\n", err);
- }
- else
- printf ("Каталог создан\n");
- }
- else {
- fflush(stdin);
- printf("Ошибка при считывании ввода");
- }
- break;
- case '2':
- printf("Введите путь к удаляемому каталогу\nНапример: \"C:\\Tools\\Dir\" \".\\Dir\" (удаляет в текущем каталоге)\n");
- if (fgets(dirPath, MAX_LEN, stdin)){
- fflush(stdin);
- dirPath[strlen(dirPath) - 1] = '\0';
- if (!RemoveDirectory(dirPath)) {
- DWORD err = GetLastError();
- printf("Ошибка: код ошибки %ld\n", err);
- }
- else
- printf("Каталог удален\n");
- }
- else {
- fflush(stdin);
- printf("Ошибка при считывании ввода");
- }
- break;
- case '3':
- printf("Возвращаемся в меню\n");
- flag = 0;
- break;
- default:
- printf("Ошибка ввода, попробуйте еще раз\n");
- }
- } while (flag);
- }
- void fileCreate() {
- printf("Введите путь к создаваемому файлу\nНапример: \"C:\\Tools\\NewFile\" \".\\NewFile\" (в текущем каталоге)\n");
- char filePath[MAX_LEN];
- if (fgets(filePath, MAX_LEN, stdin)){
- fflush(stdin);
- filePath[strlen(filePath) - 1] = '\0';
- SECURITY_ATTRIBUTES secAttr = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
- HANDLE fileHandle = CreateFile(filePath, GENERIC_READ | GENERIC_WRITE, 0, &secAttr, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
- if (fileHandle == INVALID_HANDLE_VALUE) {
- DWORD err = GetLastError();
- if (err == ERROR_FILE_EXISTS)
- printf("Ошибка: файл уже существует\n");
- else if (err == ERROR_PATH_NOT_FOUND)
- printf("Ошибка: путь к файлу не существует\n");
- else
- printf("Ошибка: код ошибки %ld\n", err);
- }
- else {
- printf("Файл создан\n");
- CloseHandle(fileHandle);
- }
- }
- else {
- fflush(stdin);
- printf("Ошибка при считывании ввода");
- }
- }
- void fileCopyMove() {
- int flag = 1;
- do {
- printf("1 - Копирование файла\n2 - Перемещение файла\n3 - Возврат в меню\n");
- char c = getchar();
- fflush(stdin);
- char exFilePath[MAX_LEN];
- char newFilePath[MAX_LEN];
- switch (c) {
- case '1':
- printf("Введите путь к копируемому файлу\nНапример: \"C:\\Tools\\File\" \".\\File\" (в текущем каталоге)\n");
- if (fgets(exFilePath, MAX_LEN, stdin)){
- fflush(stdin);
- exFilePath[strlen(exFilePath) - 1] = '\0';
- printf("Введите путь к новому файлу\nНапример: \"C:\\Tools\\NewFile\" \".\\NewFile\" (в текущем каталоге)\n");
- if (fgets(newFilePath, MAX_LEN, stdin)) {
- fflush(stdin);
- newFilePath[strlen(newFilePath) - 1] = '\0';
- if (!CopyFile(exFilePath, newFilePath, TRUE)){
- DWORD err = GetLastError();
- if (err == ERROR_FILE_EXISTS) {
- printf("Файл с таким именем уже существует. Перезаписать его?\n1 - да, 2 - нет\n");
- char c1 = getchar();
- fflush(stdin);
- int flag1 = 1;
- do {
- switch(c1) {
- case '1':
- CopyFile(exFilePath, newFilePath, FALSE);
- printf("Файл перезаписан\n");
- flag1 = 0;
- break;
- case '2':
- printf("Отмена копирования\n");
- flag1 = 0;
- break;
- default:
- printf("Ошибка ввода, попробуйте еще раз\n");
- }
- } while (flag1);
- }
- else if (err == ERROR_PATH_NOT_FOUND)
- printf("Ошибка: путь к файлу не существует\n");
- else if (err == ERROR_FILE_NOT_FOUND)
- printf("Ошибка: исходный файл не существует\n");
- else
- printf("Ошибка: код ошибки: %ld\n", err);
- }
- else
- printf("Файл скопирован\n");
- }
- else {
- fflush(stdin);
- printf("Ошибка при считывании ввода");
- }
- }
- else {
- fflush(stdin);
- printf("Ошибка при считывании ввода");
- }
- break;
- case '2':
- printf("Введите путь к перемещаемому файлу или директории\nНапример: \"C:\\Tools\\File\" \".\\File\" (в текущем каталоге)\n");
- if (fgets(exFilePath, MAX_LEN, stdin)){
- fflush(stdin);
- exFilePath[strlen(exFilePath) - 1] = '\0';
- printf("Введите путь к новому файлу или директории\nНапример: \"C:\\Tools\\NewFile\" \".\\NewFile\" (в текущем каталоге)\n");
- if (fgets(newFilePath, MAX_LEN, stdin)) {
- fflush(stdin);
- newFilePath[strlen(newFilePath) - 1] = '\0';
- if (!MoveFile(exFilePath, newFilePath)){
- DWORD err = GetLastError();
- if (err == ERROR_ALREADY_EXISTS) {
- printf("Файл/директория с таким именем уже существует. Перезаписать его?\n1 - да, 2 - нет\n");
- char c1 = getchar();
- fflush(stdin);
- int flag1 = 1;
- do {
- switch(c1) {
- case '1':
- MoveFileEx(exFilePath, newFilePath, MOVEFILE_REPLACE_EXISTING);
- printf("Файл/директория перезаписан(-а)\n");
- flag1 = 0;
- break;
- case '2':
- printf("Отмена перемещения\n");
- flag1 = 0;
- break;
- default:
- printf("Ошибка ввода, попробуйте еще раз\n");
- }
- } while (flag1);
- }
- else if (err == ERROR_PATH_NOT_FOUND)
- printf("Ошибка: путь к файлу не существует\n");
- else if (err == ERROR_FILE_NOT_FOUND)
- printf("Ошибка: исходный файл не существует\n");
- else
- printf("Ошибка: код ошибки: %ld\n", err);
- }
- else
- printf("Файл/директория перемещен(-а)\n");
- }
- else {
- fflush(stdin);
- printf("Ошибка при считывании ввода");
- }
- }
- else {
- fflush(stdin);
- printf("Ошибка при считывании ввода");
- }
- break;
- case '3':
- printf("Возвращаемся в меню\n");
- flag = 0;
- break;
- default:
- printf("Ошибка ввода, попробуйте еще раз\n");
- }
- } while (flag);
- }
- void fileAttr() {
- printf("Введите путь к файлу, о котором хотите получить информацию\nНапример: \"C:\\Tools\\File\" \".\\File\" (в текущем каталоге)\n");
- char filePath[MAX_LEN];
- if (fgets(filePath, MAX_LEN, stdin)){
- fflush(stdin);
- filePath[strlen(filePath) - 1] = '\0';
- DWORD fileAttr = GetFileAttributesA(filePath);
- if (fileAttr == INVALID_FILE_ATTRIBUTES) {
- DWORD err = GetLastError();
- if (err == ERROR_FILE_NOT_FOUND)
- printf("Ошибка: файл не существует\n");
- else if (err == ERROR_PATH_NOT_FOUND)
- printf("Ошибка: путь к файлу не существует\n");
- else
- printf("Ошибка: код ошибки %ld\n", err);
- }
- else if (fileAttr == FILE_ATTRIBUTE_NORMAL) {
- printf("Файл не имеет особых атрибутов\n");
- }
- else {
- if (fileAttr & FILE_ATTRIBUTE_ARCHIVE)
- printf("Архивный файл\n");
- if (fileAttr & FILE_ATTRIBUTE_HIDDEN)
- printf("Скрытый файл\n");
- if (fileAttr & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)
- printf("Файл не индексируется\n");
- if (fileAttr & FILE_ATTRIBUTE_OFFLINE)
- printf("Оффлайн файл\n");
- if (fileAttr & FILE_ATTRIBUTE_READONLY)
- printf("Файл только для чтения\n");
- if (fileAttr & FILE_ATTRIBUTE_SYSTEM)
- printf("Системный файл\n");
- if (fileAttr & FILE_ATTRIBUTE_TEMPORARY)
- printf("Временный файл\n");
- }
- HANDLE fileHandle = CreateFile(filePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- if (fileHandle == INVALID_HANDLE_VALUE) {
- DWORD err = GetLastError();
- if (err == ERROR_FILE_NOT_FOUND)
- printf("Ошибка: файл не существует\n");
- else if (err == ERROR_PATH_NOT_FOUND)
- printf("Ошибка: путь к файлу не существует\n");
- else
- printf("Ошибка: код ошибки %ld\n", err);
- }
- else {
- LPFILETIME createTime = (LPFILETIME)malloc(sizeof *createTime);
- LPFILETIME lastAccTime = (LPFILETIME)malloc(sizeof *lastAccTime);
- LPFILETIME lastWriteTime = (LPFILETIME)malloc(sizeof *lastWriteTime);
- if (!GetFileTime(fileHandle, createTime, lastAccTime, lastWriteTime))
- printf("Ошибка: код ошибки %ld\n", GetLastError());
- else {
- LPSYSTEMTIME sysTime = (LPSYSTEMTIME)malloc(sizeof *sysTime);
- if (!FileTimeToSystemTime(createTime, sysTime))
- printf("Ошибка: код ошибки %ld\n", GetLastError());
- else
- printf("Дата создания файла: %d/%d/%d %d:%d:%d\n", sysTime->wYear, sysTime->wMonth, sysTime->wDay, sysTime->wHour, sysTime->wMinute, sysTime->wSecond);
- if (!FileTimeToSystemTime(lastAccTime, sysTime))
- printf("Ошибка: код ошибки %ld\n", GetLastError());
- else
- printf("Дата последнего доступа к файлу: %d/%d/%d %d:%d:%d\n", sysTime->wYear, sysTime->wMonth, sysTime->wDay, sysTime->wHour, sysTime->wMinute, sysTime->wSecond);
- if (!FileTimeToSystemTime(lastWriteTime, sysTime))
- printf("Ошибка: код ошибки %ld\n", GetLastError());
- else
- printf("Дата изменения файла: %d/%d/%d %d:%d:%d\n", sysTime->wYear, sysTime->wMonth, sysTime->wDay, sysTime->wHour, sysTime->wMinute, sysTime->wSecond);
- free(sysTime);
- }
- free(createTime);
- free(lastAccTime);
- free(lastWriteTime);
- CloseHandle(fileHandle);
- printf("Введите (через пробел) номера атрибутов, которые хотите добавить к файлу (или убрать, если он уже есть у файла):\n"
- "1 - архивный файл, 2 - скрытый файл, 3 - неиндексируемый файл, 4 - оффлайн файл, 5 - файл только для чтения, 6 - системный файл, 7 - временный файл\n");
- char numbers[MAX_LEN];
- if (fgets(numbers, MAX_LEN, stdin)) {
- fflush(stdin);
- numbers[strlen(numbers) - 1] = '\0';
- const int attr[8] = { 0, FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, FILE_ATTRIBUTE_OFFLINE,
- FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_TEMPORARY };
- for (int i = 0; numbers[i]; ++i) {
- if ((numbers[i] <= '7') && (numbers[i] >= '1')){
- if (attr[numbers[i] - '0'] & fileAttr)
- fileAttr = fileAttr & (~attr[numbers[i] - '0']);
- else
- fileAttr = fileAttr | attr[numbers[i] - '0'];
- }
- }
- SetFileAttributesA(filePath, fileAttr);
- }
- else {
- fflush(stdin);
- printf("Ошибка при считывании ввода");
- }
- fileHandle = CreateFile(filePath, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- LPSYSTEMTIME sysTime = (LPSYSTEMTIME)malloc(sizeof *sysTime);
- GetSystemTime(sysTime);
- LPFILETIME fileTime = (LPFILETIME)malloc(sizeof *fileTime);
- SystemTimeToFileTime(sysTime, fileTime);
- if(!SetFileTime(fileHandle, fileTime, fileTime, fileTime))
- printf("Ошибка: код ошибки %ld\n", GetLastError());
- CloseHandle(fileHandle);
- free(fileTime);
- free(sysTime);
- }
- }
- else {
- fflush(stdin);
- printf("Ошибка при считывании ввода");
- }
- }
- int main()
- {
- int flag = 1;
- system("chcp 65001");
- do {
- printf("Добро пожаловать! Выберите действие:\n1 - Вывод списка дисков\n2 - Информация о выбранном диске\n"
- "3 - Создание и удаление каталогов\n4 - Создание файлов в новых каталогах\n"
- "5 - Копирование и перемещение файлов между каталогами\n6 - Анализ и изменение атрибутов файлов\n7 - Выход\n");
- char c = getchar();
- fflush(stdin);
- switch (c){
- case '1':
- getDrives();
- break;
- case '2':
- getDriveInfo();
- break;
- case '3':
- dirCreateDelete();
- break;
- case '4':
- fileCreate();
- break;
- case '5':
- fileCopyMove();
- break;
- case '6':
- fileAttr();
- break;
- case '7':
- printf("Выход из программы\n");
- flag = 0;
- break;
- default:
- printf("Неправильный ввод, попробуйте еще раз\n");
- }
- } while (flag);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement