21 Востаннє редагувалося wander (29.05.2020 18:28:05)

Re: створення класу Dir

sasha87 написав:

А хто може щось підказати по перегляду вмісту каталогу? Як це реалізувати?

std::filesystem::directory_iterator доступний з С++17, в С++14 filesystem знаходиться в просторі імен experimental.

#include <string>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

int main() {
    std::string const path = "шлях_до_каталогу";
    for (auto&& entry : fs::directory_iterator(path))
        std::cout << entry.path() << std::endl;
}

Також є і рекурсивний ітератор std::filesystem::recursive_directory_iterator.

Подякували: koala, leofun01, Betterthanyou3

22

Re: створення класу Dir

О, дякую, пропустив. Мені чомусь здавалося, що файлові функції перенесли на C++20.

23

Re: створення класу Dir

sasha87 написав:

а як це зробити з рекурсією?

Приклад (на рос)

Прихований текст

ur_naz, шо поганого в MAX_PATH+1 ? це стандартна довжина до для бiльшостi шляхiв у вiндi. Так, з десятки вже iнакше, i ранiше можна було через нт-шлях використовувати бiльше. Але - для прикладу, для учбового завдання це нормально!!!

24

Re: створення класу Dir

Готово!!! Працює!

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <ostream>
#include <string.h>
#include <windows.h>
#include <direct.h>
#include <stdlib.h>
#include <stdio.h>
#include<ctime>
#include <io.h>

using namespace std;
class DIR
{
    char sPath[MAX_PATH];
    char sPName[MAX_PATH];
public:

    char* GetsPath()
    {
        return sPath;
    }
    void add_file()
    {
        ofstream Dir;
        Dir.open("B:\\SHAG2020\\text3.txt", ofstream::app);
        Dir << "test_2020" << endl;
        if (!Dir.is_open())

        {
            cout << "ошыбка открытия файла" << endl;
        }
        Dir.close();
    }
    void Dir_create()
    {

        strcpy(sPath, "B:\\SHAG");
        if (_mkdir(sPath) == 0)
            printf("Creation \r\n%s\r\n SUCCESFULLY COMPLETED\r\n", sPath);
    }

    bool Show_Directory(const char *path)
    {
        _finddata32_t find;
        char pathfind[MAX_PATH];
        strcpy(pathfind, path);
        strcat(pathfind, "\\*.*");
        char info[MAX_PATH];
        int result = _findfirst32(path, &find);
        system("cls");
        int flag = result;
        if (flag == -1) {
            strcpy(info, "Такой Директории Нет");
            cout << info << endl;
            printf("%s\n", info);
            return false;
        }
        while (flag != -1) {
            if (strcmp(find.name, ".") && strcmp(find.name, "..")) {
                find.attrib & 0x10 ? strcpy(info, " Каталог ") :
                    strcpy(info, " Файл ");
                cout << info << endl;
                cout << find.name << endl;
                printf("%30s %10s\n", find.name, info);
            }
            flag = _findnext32(result, &find);
        }
        
        _findclose(result);
        return true;
    }
 
    void rename_file()
    {
        char oldName[50], newName[50];

        cout << "Enter old name:"; 
        cin >> oldName;
        cout << "Enter new name:";
        cin >> newName;

        if (rename(oldName, newName) != 0)
            cout << "Error!\n Couldn't rename file.Check old and new filename...\n\n";
        else
            cout << "Ok...\n\n";
    }
    
    void Del_file()
    {
        char Name[50];
        cout << "Enter name:"; 
        cin >> Name; 
        if (remove(Name) != 0) 
            cout << "Error!\n Couldn't remove file.Check filename...\n";
        else
            cout << "Ok...\n";
    }

    void del_dir()
    {
        strcpy(sPath, "B:\\SHAG2020");
        if (_rmdir(sPath) == 0)
            printf("%s\r\n SUCCESFULLY DELETED\r\n", sPath);
    }
};

void Menu_()
{
    cout << "\t    menu:DIRECTORY" << endl;
    cout << "1 - вывести содержимое каталога" << endl;
    cout << "2 - создать файл" << endl;
    cout << "3 - удалить файл" << endl;
    cout << "4 - переименовать файл" << endl;
    cout << "5 - создать каталог" << endl;
    cout << "6 - удалить каталог" << endl;
    cout << "7 - EXIT" << endl;
}

int main()
{
    setlocale(LC_ALL, "");
    string text;
    DIR d;
    int Menu = 0;
    do {
        system("cls");
        Menu_();
        cin >> Menu;
        switch (Menu)
        {
        case 1:
            d.Show_Directory("B:\\SHAG2020");
            cout << "" << endl;
            system("pause");
            break;
        case 2:
            cout << "создание файла " << endl;
            d.add_file();
            cout << "файл успешно создан" << endl;
            system("pause");
            break;
        case 3:
            d.Del_file();
            cout << "файл удален" << endl;
            system("pause");
            break;
        case 4:
            d.rename_file();
            cout << "файл переименован" << endl;
            system("pause");
            break;
        case 5:
            d.Dir_create();
            cout << "каталог создан" << endl;
            system("pause");
            break;
        case 6:
            d.del_dir();
            system("pause");
            break;
            
        }
    } while (Menu != 7);
        system("pause");
    return 0;
}

25

Re: створення класу Dir

Теги code додайте.
Я так розумію, ви змішали функції з різних бібліотек, а це не дуже добре.
Ну і в кожному варіанті switch у вас є system("pause"); - а отже, його можна винести і поставити після switch.

26

Re: створення класу Dir

а чому не дуже добре?

27 Востаннє редагувалося wander (30.05.2020 14:09:19)

Re: створення класу Dir

koala написав:

Ну і в кожному варіанті switch у вас є system("pause"); - а отже, його можна винести і поставити після switch.

system("pause") взагалі там не потрібен.

P.S. - Також я бачу, що ТС змішує використання різних іноземних мов у своїй програмі, оце точно не дуже добре.

28

Re: створення класу Dir

wander написав:

system("pause") взагалі там не потрібен.

Чи потрібен він там - питання до почуття естетики автора; взагалі він не дуже потрібен, бо це питання до IDE - чому консоль закривається. Втім, у шкільній практиці це найпростіший спосіб поставити паузу.

wander написав:

Також я бачу, що ТС змішує використання різних іноземних мов

ТС змішує використання шматків коду з різних джерел без редагування, що є взагалі прямим шляхом у пекло.

sasha87 написав:

а чому не дуже добре?

Несерйозні причини:

  1. Розмір програми зростає, бо втягає зайві бібліотеки (але яка різниця в часи гігабайтів, хоча треба дивитися по ситуації);

  2. Через непотрібні залежності зростає час компіляції (знову ж таки - яка різниця);

  3. Функції з різних бібліотек можуть бути частково несумісними одна з одною, і ви про це дізнаєтеся лише коли спробуєте використати саме таку комбінацію.

Серйозна причина - залежність. Коли ви використовуєте бібліотеку, ви стаєте залежним від неї. Наприклад, час від часу в бібліотеках виявляють вразливості і випускають оновлення. Більше залежностей - більше причин для непотрібної роботи.

29

Re: створення класу Dir

koala написав:

бо це питання до IDE - чому консоль закривається

Це питання до того хто користується IDE, якщо добре її попросити, то консоль не закриватиметься ;)

Подякували: leofun01, koala2