
#include <windows.h>
#include <stdio.h>
#include <locale.h>
#include <tchar.h>



void printError(const wchar_t* message) {
    wprintf(L"%s: %lu\n", message, GetLastError());
}


void listFilesAndDirectories(wchar_t* drivePath) {
    WIN32_FIND_DATA findFileData;
    //wchar_t searchPath[MAX_PATH];
    //swprintf(searchPath, MAX_PATH, L"%s*", drivePath);
    SetCurrentDirectory(drivePath);
    HANDLE hFind = FindFirstFile(L"*", &findFileData);
    if (hFind == INVALID_HANDLE_VALUE) {
        wprintf(L"Ошибка доступа к директории.\n");
        return;
    }

    wprintf(L"Список файлов и каталогов в корне %s:\n", drivePath);
    do {
        wprintf(L"%s\n", findFileData.cFileName);
    } while (FindNextFile(hFind, &findFileData) != 0);

    FindClose(hFind);
}




void deleteFileOrDirectory(wchar_t* path) {
    DWORD attributes = GetFileAttributes(path);
    if (attributes == INVALID_FILE_ATTRIBUTES) {
        wprintf(L"Файл или каталог не найден.\n");
       return;
    }

    if (attributes & FILE_ATTRIBUTE_DIRECTORY) {
        // Удаление каталога
        if (RemoveDirectory(path)) {
            wprintf(L"Каталог %s успешно удален.\n", path);
        }
        else {
            wprintf(L"Не удалось удалить каталог %s.\n", path);
        }
    }
    else {
        // Удаление файла
        if (DeleteFile(path)) {
            wprintf(L"Файл %s успешно удален.\n", path);
        }
        else {
            wprintf(L"Не удалось удалить файл %s.\n", path);
        }
    }
}


int main()
{
    setlocale(LC_ALL, "");

    wprintf(L"LABA 1\n");
    
    //GetCurrentDirectory
    WCHAR buffer[MAX_PATH];
    DWORD length;

    // Получаем текущую директорию
    length = GetCurrentDirectory(MAX_PATH, buffer);
   
    wprintf(L"Current directory : %s\n", buffer);
   


    //SetCurrentDirectory
    SetCurrentDirectory(L"D:\\univer");
    WCHAR buffer1[MAX_PATH];
    DWORD length1;

    // Получаем текущую директорию
    length1 = GetCurrentDirectory(MAX_PATH, buffer1);

    wprintf(L"Current directory after change : %s\n", buffer1);



    //GetLogicalDrives
    DWORD drives = GetLogicalDrives();
   
    printf("Logical drives bitmask: 0x%lx\n", drives);

    for (int i = 0; i < 26; i++) {
        // Проверяем, установлен ли бит, соответствующий текущему диску
        if (drives & (1 << i)) {
            // Формируем имя диска (например, "C:\")
            char driveName[4] = { 'A' + i, ':', '\\', '\0' };
            printf(driveName);  
            
        }
    }
    printf("\n");




    //FindFirstFile  FindNextFileW    FindClose
    WIN32_FIND_DATA findFileData;
    HANDLE hFind = FindFirstFile(L"D:\\poznanie\\*", &findFileData);;

    if (hFind != INVALID_HANDLE_VALUE) {
        do {
            wprintf(L"Найден файл: %s\n", findFileData.cFileName);
        } while (FindNextFileW(hFind, &findFileData) != 0);

        // Закрываем дескриптор поиска
        FindClose(hFind);
    }






    wchar_t dir[512] = L"D:\\poznanie"; // Укажите ваш путь
    wchar_t filePath[512];

    // Создание полного пути к файлу
    swprintf(filePath, 512, L"%s\\example.txt", dir);

    // Создание и работа с файлом
    HANDLE hFile = CreateFileW(filePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
   


    // Запись в файл
    const char* data = "Hello, World!"; // Данные для записи
    DWORD written;
    if (!WriteFile(hFile, data, (DWORD)strlen(data), &written, NULL)) {
       
        CloseHandle(hFile);
        return 1;
    }

    // Закрытие файла
    CloseHandle(hFile);

    // Открытие файла для чтения
    hFile = CreateFileW(filePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
        return 1;
    }

    // Чтение из файла
    char bufferRead[256]; // Буфер для чтения
    DWORD read;
    if (!ReadFile(hFile, bufferRead, sizeof(bufferRead) - 1, &read, NULL)) {
        CloseHandle(hFile);
        return 1;
    }
    bufferRead[read] = '\0'; // Завершаем строку

    // Печать прочитанных данных
    printf("Прочитанные данные: %s\n", bufferRead); // Используйте %s для char








    wchar_t filePath1[256] = L"C:\\ProgramData"; 
    wchar_t fullPath[256]; 

    if (!GetFullPathNameW(filePath1, 256, fullPath, NULL)) {
        CloseHandle(hFile); 
        return 1;
    }

    wprintf(L"Полный путь к файлу: %s\n", fullPath); 

    // Получение атрибутов файла
    DWORD attributes = GetFileAttributesW(filePath1);
    if (attributes == INVALID_FILE_ATTRIBUTES) {
        CloseHandle(hFile);
        return 1;
    }
    wprintf(L"Атрибуты файла: %lu\n", attributes);
    if (attributes & FILE_ATTRIBUTE_HIDDEN) { // Проверка на скрытый атрибут
        wprintf(L"Атрибуты файла: скрытый\n");
    }
    if (attributes & FILE_ATTRIBUTE_SYSTEM) {
        wprintf(L"Атрибуты файла: Файл или каталог, часть или весь каталог которого использует операционная система.\n");
    }
    if (attributes & FILE_ATTRIBUTE_ARCHIVE) { 
        wprintf(L"Атрибуты файла: Файл или каталог, который является архивным файлом или каталогом.\n ");
    }
    if (attributes & FILE_ATTRIBUTE_DIRECTORY) {
        wprintf(L"Атрибуты файла: Директория\n ");
    }
    if (attributes & FILE_ATTRIBUTE_DEVICE) {
        wprintf(L"Атрибуты файла: Директория \n");
    }
    if (attributes & FILE_ATTRIBUTE_NORMAL) {
        wprintf(L"Атрибуты файла: Файл, у которого не установлены другие атрибуты.\n ");
    }
    if (attributes & FILE_ATTRIBUTE_TEMPORARY) {
        wprintf(L"Атрибуты файла: Файл, который используется для временного хранения. \n ");
    }
    if (attributes & FILE_ATTRIBUTE_SPARSE_FILE) {
        wprintf(L"Атрибуты файла: Файл, который является разреженным файлом. \n");
    }
    if (attributes & FILE_ATTRIBUTE_REPARSE_POINT) {
        wprintf(L"Атрибуты файла: Файл или каталог, имеющий связанную точку повторной обработки, или файл, являющийся символической ссылкой.Файл или каталог, имеющий связанную точку повторной обработки, или файл, являющийся символической ссылкой.\n ");
    }
    if (attributes & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) {
        wprintf(L"Атрибуты файла: Файл или каталог не подлежит индексации службой индексации контента. \n");
    }
    // Получение размера файла

    
    DWORD fileSize = GetFileSize(hFile, NULL);
    if (fileSize == INVALID_FILE_SIZE) {
        
        CloseHandle(hFile);
        return 1;
    }
    wprintf(L"Размер файла: %lu байт\n", fileSize);

    // Получение времени создания файла
    FILETIME creationTime, lastAccessTime, lastWriteTime;
    if (!GetFileTime(hFile, &creationTime, &lastAccessTime, &lastWriteTime)) {
       
        CloseHandle(hFile);
        return 1;
    }

    SYSTEMTIME stUTC, stLocal;
    FileTimeToSystemTime(&creationTime, &stUTC);
    SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
    wprintf(L"Время создания файла: %02d/%02d/%d %02d:%02d\n", stLocal.wDay, stLocal.wMonth, stLocal.wYear, stLocal.wHour, stLocal.wMinute);

    // Закрытие файла
    CloseHandle(hFile);














    /*setlocale(LC_ALL, "");

    DWORD drives1 = GetLogicalDrives();
    wprintf(L"Доступные логические диски:\n");

    for (int i = 0; i < 26; i++) {
        if (drives1 & (1 << i)) {
            wchar_t driveLetter = L'A' + i;
            wprintf(L"%c:\\\n", driveLetter);
        }
    }

 




    wprintf(L"Доступные логические диски:\n");
    //GetLogicalDriveStrings
    WCHAR b[256];

    // Получаем строки логических дисков
    DWORD result = GetLogicalDriveStrings(256, b);

    WCHAR* drive = b;
    // Пока не достигнут конец всех строк
    while (*drive) {
        wprintf(L"Диск: %ls\n", drive);
        // Переходим к следующей строке
        drive += 4;
    }


    wchar_t chosenDrive[4]; 
    wprintf(L"\nВведите логический диск (например, C:\\): ");
    wscanf_s(L"%3s", chosenDrive, (unsigned)_countof(chosenDrive));

    listFilesAndDirectories(chosenDrive);

    wchar_t targetPath[MAX_PATH];
    wprintf(L"\nВведите имя файла или каталога для удаления (например, C:\\example.txt): ");
    wscanf_s(L"%259s", targetPath, (unsigned)_countof(targetPath));

    deleteFileOrDirectory(targetPath);
    return 0;
  
}

*/


