Различия
Показаны различия между двумя версиями страницы.
— | fajl [2025/07/06 12:38] (текущий) – создано - внешнее изменение 127.0.0.1 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== Примеры работы с файлами на С, С++====== | ||
+ | |||
+ | {{htmlmetatags> | ||
+ | metatag-description=(Функции для работы с содержимым файла библиотеки языка C.) | ||
+ | }} | ||
+ | |||
+ | Определение: | ||
+ | |||
+ | Любой файл обладает следующим рядом особенностей: | ||
+ | * Файл не может располагаться на диске непрерывно, | ||
+ | * Название файла не может содержать символы: | ||
+ | * Большинство файлов обладает расширением - сочетанием символов, | ||
+ | * У каждого файла есть, так называемые атрибуты, | ||
+ | Термины: | ||
+ | * **Дескриптор файла** - уникальный номер, который операционная система присваивает любому открытому файлу, что бы отличать его от других. Когда файл закрывается, | ||
+ | * **Файловый указатель** - специальная переменная, | ||
+ | Существует несколько разновидностей файлов. В Windows таких разновидностей две: текстовый файл и бинарный (двоичный) файл. | ||
+ | <note important> | ||
+ | ====== Функции для работы с содержимым файла библиотеки языка C ====== | ||
+ | ===== Функции библиотеки stdio.h ===== | ||
+ | ==== fopen ==== | ||
+ | < | ||
+ | FILE *fopen(const char *filename, const char *mode) | ||
+ | </ | ||
+ | |||
+ | Функция открывает файл. | ||
+ | |||
+ | filename - путь к файлу | ||
+ | |||
+ | mode - тип доступа | ||
+ | |||
+ | < | ||
+ | r - чтение, | ||
+ | w - запись, | ||
+ | a - добавление в конец, если файла нет, то он создаётся | ||
+ | r+ чтение и запись (файл должен существовать) | ||
+ | w+ - чтение и запись (принцип работы как у w) | ||
+ | a+ - добавление и чтение (принцип работы как у a) | ||
+ | </ | ||
+ | < | ||
+ | Если функция отработала успешно, | ||
+ | |||
+ | < | ||
+ | |||
+ | ==== fclose ==== | ||
+ | int fclose( FILE *stream ) | ||
+ | |||
+ | Функция закрывает файл. | ||
+ | |||
+ | stream - указатель на закрываемый файл. | ||
+ | |||
+ | Если всё проходит успешно, | ||
+ | < | ||
+ | |||
+ | |||
+ | char *fgets( char *string, int n, FILE *stream ) | ||
+ | |||
+ | |||
+ | |||
+ | Считывает строку начиная с текущей позиции. | ||
+ | |||
+ | Считывание останавливается: | ||
+ | |||
+ | ...если был найден символ перехода на новую строчку ( он помещается в строку ) | ||
+ | ...если достигнут конец файла | ||
+ | ...если считано n-1 символов. | ||
+ | string - cтрока, | ||
+ | |||
+ | n - количество элементов в string | ||
+ | |||
+ | stream - указатель на открытый файл | ||
+ | |||
+ | Если всё прошло успешно функция возвращает считанную строку, | ||
+ | |||
+ | |||
+ | int fputs( const char *string, FILE *stream ) | ||
+ | |||
+ | |||
+ | |||
+ | Записывает строку в файл, начиная с текущей позиции. | ||
+ | |||
+ | string - строка для записи | ||
+ | |||
+ | stream - указатель на открытый файл, куда производиться запись | ||
+ | |||
+ | Если функция отрабатывает успешно из неё возвращается неотрицательное значение. При ошибке возвращается EOF. | ||
+ | |||
+ | |||
+ | -------------------------------------------------------------------------------- | ||
+ | size_t fread( void *buffer, size_t size, size_t count, FILE *stream ) | ||
+ | |||
+ | |||
+ | |||
+ | Функция считывает данные из файла в буфер. | ||
+ | |||
+ | buffer - адрес массива, | ||
+ | |||
+ | size - размер элемента массива в байтах | ||
+ | |||
+ | count - максимальное количество элементов для считывания | ||
+ | |||
+ | stream - указатель на открытый файл. | ||
+ | |||
+ | Функция возвращает количество считанных байт. | ||
+ | |||
+ | Примечание: | ||
+ | |||
+ | -------------------------------------------------------------------------------- | ||
+ | size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream ) | ||
+ | |||
+ | |||
+ | |||
+ | Функция записывает массив данных в файл. | ||
+ | |||
+ | buffer - адрес массива, | ||
+ | |||
+ | size - размер элемента массива в байтах | ||
+ | |||
+ | count - максимальное количество элементов для записи в файл | ||
+ | |||
+ | stream - указатель на открытый файл. | ||
+ | |||
+ | Функция возвращает количество записанных байт. | ||
+ | |||
+ | |||
+ | -------------------------------------------------------------------------------- | ||
+ | int feof( FILE *stream ) | ||
+ | |||
+ | |||
+ | |||
+ | Функция проверяет достигнут ли конец файла. | ||
+ | |||
+ | stream - указатель на открытый файл | ||
+ | |||
+ | Функция возвращает ненулевое значение, | ||
+ | |||
+ | |||
+ | -------------------------------------------------------------------------------- | ||
+ | int _fileno( FILE *stream ) | ||
+ | |||
+ | |||
+ | |||
+ | Данная функция возвращает дескриптор файла. | ||
+ | |||
+ | stream - указатель на открытый файл. | ||
+ | |||
+ | |||
+ | -------------------------------------------------------------------------------- | ||
+ | int fseek ( FILE *stream, int offset [, int whence] ) | ||
+ | |||
+ | |||
+ | |||
+ | Устанавливает смещение в файле | ||
+ | |||
+ | stream - указатель на открытый файл | ||
+ | |||
+ | offset - смещение, | ||
+ | |||
+ | whence - точка, от которой производится смещение | ||
+ | |||
+ | SEEK_SET (0) - начало файла | ||
+ | SEEK_CUR (1) - позиция текущего указателя файла | ||
+ | SEEK_END (2) - конец файла (EOF) | ||
+ | Функция возвращает значение 0, если указатель файла успешно перемещен, | ||
+ | |||
+ | |||
+ | -------------------------------------------------------------------------------- | ||
+ | |||
+ | ===== Функции библиотеки io.h ===== | ||
+ | ==== _access ==== | ||
+ | int _access( const char *path, int mode ) Функция определяет разрешения файла или директории. | ||
+ | * path - путь к файлу или директории | ||
+ | * mode - флаги для проверки< | ||
+ | 00 - проверка на существование | ||
+ | 02 - проверка на разрешение на запись | ||
+ | 04 - проверка на разрешение на чтение | ||
+ | 06 - проверка на чтение и запись | ||
+ | </ | ||
+ | Если разрешение есть, функция возвращает ноль, в случае отсутствия -1. | ||
+ | < | ||
+ | < | ||
+ | // | ||
+ | if (_access(str, | ||
+ | cout<<" | ||
+ | exit; | ||
+ | } | ||
+ | </ | ||
+ | ==== _filelength ==== | ||
+ | long _filelength( int handle ) | ||
+ | |||
+ | Возвращает размер файла в байтах. | ||
+ | |||
+ | handle - дескриптор файла. | ||
+ | |||
+ | В случае ошибки функция возвращает -1. | ||
+ | |||
+ | int _locking( int handle, int mode, long nbytes ) | ||
+ | |||
+ | |||
+ | Блокирует или разблокирует байты файла начиная с текущей позиции в файле. | ||
+ | |||
+ | handle - дескриптор файла | ||
+ | |||
+ | mode - тип блокировки | ||
+ | |||
+ | _LK_LOCK - блокирует байты, если заблокировать байты не получается попытка повторяется через 1 секунду.Если после 10 попыток байты не заблокируются функция генерирует ошибку и возвращает -1 | ||
+ | _LK_NBLCK - блокирует байты, если заблокировать байты не получается функция генерирует ошибку и возвращает -1 | ||
+ | _LK_NBRLCK - то же самое, что и _LK_NBLCK | ||
+ | _LK_RLCK - то же самое, что и _LK_LOCK | ||
+ | _LK_UNLCK - разблокировка байт, которые были до этого заблокированы | ||
+ | nbytes - количество байт для блокировки | ||
+ | |||
+ | Функция locking возвращает -1, если происходит ошибка и 0 в случае успеха. | ||
+ | |||
+ | < | ||
+ | ====== Функции для работы с файлами и директориям ====== | ||
+ | stdio.h - переименование и удаление файлов. | ||
+ | ===== rename ===== | ||
+ | rename (char * oldname, char * newname) | ||
+ | |||
+ | Переименовывает файл. | ||
+ | |||
+ | oldname - путь и текущее имя файла newname - путь и новое имя файла | ||
+ | |||
+ | Функция возвращает 0, если имя файла было успешно изменено, | ||
+ | |||
+ | <note important> | ||
+ | ===== remove ===== | ||
+ | int remove(const char * filename) Удаляет файл. | ||
+ | |||
+ | filename - путь и имя файла | ||
+ | |||
+ | Функция возвращает 0, если имя файл был успешно удален, | ||
+ | <note important> | ||
+ | ===== _chmod ===== | ||
+ | Установка прав на файл. | ||
+ | < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | _chmod( " | ||
+ | </ | ||
+ | ===== _findfirst _findnext ===== | ||
+ | * **_findfirst**(char * path, _finddata_t * fileinfo) | ||
+ | io.h - поиск файлов. | ||
+ | Находит файлы по указанному пути, соответствующие маске. | ||
+ | |||
+ | < | ||
+ | Маска - строка, | ||
+ | path - строка, | ||
+ | </ | ||
+ | **fileinfo** - указатель на объект структуры , в который запишется информация о найденном файле. Структура _finddata_t содержит следующие поля: | ||
+ | < | ||
+ | unsigned attrib - содержит информацию об атрибутах файла. | ||
+ | _A_NORMAL - Обычный файл без запретов на чтение или запись. | ||
+ | _A_RDONLY - Файл только для чтения. | ||
+ | _A_HIDDEN - Скрытый файл. | ||
+ | _A_SYSTEM - Системный файл. | ||
+ | _A_SUBDIR - Директория. | ||
+ | _A_ARCH - Архивный файл. | ||
+ | time_t time_create - время/ | ||
+ | time_t time_access - время/ | ||
+ | time_t time_write - время/ | ||
+ | _fsize_t size - размер файла | ||
+ | char name[260] - имя файла | ||
+ | </ | ||
+ | Если всё пройдет успешно, | ||
+ | * **_findnext**(long done, _finddata_t * fileinfo) Функция осуществляет переход на следующий найденный файл в группе. | ||
+ | done - уникальный номер группы файлов в памяти. | ||
+ | fileinfo - указатель на объект структуры, | ||
+ | Если достигнут конец списка файлов, | ||
+ | * **_findclose**(long done) Функция очищает память от группы найденных файлов. done - уникальный номер группы файлов в памяти. | ||
+ | ===== Как удалить файл? ===== | ||
+ | * Если важна переносимость можно использовать класс boost/ | ||
+ | < | ||
+ | namespace boost | ||
+ | { | ||
+ | | ||
+ | { | ||
+ | bool remove( const path & ph ); | ||
+ | unsigned long remove_all( const path & ph ); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | * < | ||
+ | BOOL DeleteFile(LPCTSTR lpFileName); | ||
+ | CFile:: | ||
+ | </ | ||
+ | * Мне остается только назвать неназванный способ: | ||
+ | |||
+ | WINSHELLAPI int WINAPI SHFileOperation(LPSHFILEOPSTRUCT lpFileOp) | ||
+ | |||
+ | |||
+ | |||
+ | Для этого надо заполнить основные поля структуры SHFILEOPSTRUCT: | ||
+ | < | ||
+ | |||
+ | HWND hwnd; — родительское окно | ||
+ | |||
+ | UINT wFunc; — в твоем случае FO_DELETE | ||
+ | |||
+ | LPCSTR pFrom; — путь удаляемго файла (можно использовать маски!) | ||
+ | |||
+ | FILEOP_FLAGS fFlags; — флаги; например OF_FILESONLY (мучить только файлы), | ||
+ | </ | ||
+ | Там есть еще некоторые другие поля, разберешься. Подробнее читай Программист №1_2001 (http:// | ||
+ | |||
+ | В чем преимущество этого способа: | ||
+ | 1. Индикатор удаления. Если файлов много юзер сможет наблюдать виндосное окошко | ||
+ | 2. Можно использовать маски в именах файлов | ||
+ | * < | ||
+ | int _unlink( const char *filename ); | ||
+ | </ | ||
+ | |||
+ | ===== Вывести атрибуты файла, директории ===== | ||
+ | Программа выводит атрибуты файла или директории, | ||
+ | < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | using namespace std; | ||
+ | |||
+ | int main(int argc, char** argv) { | ||
+ | if(argc==1) exit(1); | ||
+ | struct _finddata_t fileinfo; | ||
+ | char str[200]; | ||
+ | strcpy(str, | ||
+ | long done = _findfirst(str, | ||
+ | char szBuffer[30]; | ||
+ | |||
+ | // | ||
+ | ctime_s ( szBuffer, _countof (szBuffer),& | ||
+ | |||
+ | printf ( " %-24s %.24s %9ld ", fileinfo.name, | ||
+ | cout<<" | ||
+ | printf( ( fileinfo.attrib & _A_SUBDIR ) ? " | ||
+ | printf( ( fileinfo.attrib & _A_RDONLY ) ? " | ||
+ | printf( ( fileinfo.attrib & _A_HIDDEN ) ? " | ||
+ | printf( ( fileinfo.attrib & _A_SYSTEM ) ? " | ||
+ | printf( ( fileinfo.attrib & _A_ARCH ) ? " | ||
+ | printf( ( fileinfo.attrib & _A_NORMAL ) ? " | ||
+ | cout<<" | ||
+ | |||
+ | _findclose(done); | ||
+ | } | ||
+ | </ | ||
+ | ===== Пример программы на работу с файлами ===== | ||
+ | < | ||
+ | // Здесь находятся функции переименования и удаления | ||
+ | #include < | ||
+ | // Здесь находятся функции для поиска файлов | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | using namespace std; | ||
+ | // для функции AnsiToOem | ||
+ | #include < | ||
+ | |||
+ | // Переименовать существующий файл | ||
+ | void RenameFile(); | ||
+ | |||
+ | // Удалить существующий файл | ||
+ | void RemoveFile(); | ||
+ | |||
+ | // Поиск файлов в каталоге | ||
+ | void Dir(); | ||
+ | |||
+ | void main() | ||
+ | { | ||
+ | // предлагаем выбрать пункт меню для выполнения | ||
+ | cout << " | ||
+ | |||
+ | // | ||
+ | char ch; | ||
+ | do{ | ||
+ | // Переименовать | ||
+ | cout << "\n1 - Rename\n"; | ||
+ | // Удалить | ||
+ | cout << "2 - Remove\n"; | ||
+ | // Просмотреть некоторую папку(каталог) | ||
+ | cout << "3 - View some folder\n"; | ||
+ | // Выход | ||
+ | cout << "0 - Exit\n\n"; | ||
+ | cin >> ch; | ||
+ | |||
+ | // анализируем и вызываем | ||
+ | // соответствующую | ||
+ | switch(ch) | ||
+ | { | ||
+ | case ' | ||
+ | RenameFile(); | ||
+ | break; | ||
+ | case ' | ||
+ | RemoveFile(); | ||
+ | break; | ||
+ | case ' | ||
+ | Dir(); | ||
+ | break; | ||
+ | } | ||
+ | } while(ch != ' | ||
+ | } | ||
+ | |||
+ | // Переименовать существующий файл | ||
+ | void RenameFile() | ||
+ | { | ||
+ | char oldName[50], | ||
+ | |||
+ | // В одной переменной запомним существующее имя (oldName), | ||
+ | cout << "Enter old name:"; | ||
+ | cin >> oldName; | ||
+ | |||
+ | // А в другой новое имя(newName) | ||
+ | cout << "Enter new name:"; | ||
+ | cin >> newName; | ||
+ | |||
+ | // Произведем переименование и проверку результата | ||
+ | if (rename(oldName, | ||
+ | cout << " | ||
+ | else | ||
+ | cout << " | ||
+ | } | ||
+ | |||
+ | // Удалить существующий файл | ||
+ | void RemoveFile() | ||
+ | { | ||
+ | char Name[50]; | ||
+ | // Получаем имя и путь к удаляемому файлу | ||
+ | cout << "Enter name:"; | ||
+ | cin >> Name; | ||
+ | |||
+ | // | ||
+ | if (remove(Name) != 0) | ||
+ | cout << " | ||
+ | else | ||
+ | cout << " | ||
+ | } | ||
+ | |||
+ | // Поиск файлов в каталоге | ||
+ | void Dir() | ||
+ | { | ||
+ | // Запросим ПУТЬ (например, | ||
+ | // таким вот образом: | ||
+ | char path[70]; | ||
+ | cout << " | ||
+ | cin >> path; | ||
+ | |||
+ | // Запросим маску файлов | ||
+ | char mask[15]; | ||
+ | cout << " | ||
+ | cin >> mask; | ||
+ | |||
+ | // Соединив две строки, | ||
+ | // т.е. что хочет найти пользователь и где | ||
+ | strcat(path, | ||
+ | |||
+ | // Объявление указателя fileinfo на структуру _finddata_t | ||
+ | // и создание динамического объекта структуры _finddata_t | ||
+ | _finddata_t *fileinfo=new _finddata_t; | ||
+ | |||
+ | // Начинаем поиск | ||
+ | long done = _findfirst(path, | ||
+ | |||
+ | // если done будет равняться -1, | ||
+ | // то поиск вести бесмысленно | ||
+ | int MayWeWork = done; | ||
+ | |||
+ | // Счетчик, | ||
+ | int count = 0; | ||
+ | while (MayWeWork!=-1) | ||
+ | { | ||
+ | count++; | ||
+ | // перекодировали имя найденного файла | ||
+ | // на случай, | ||
+ | AnsiToOem(fileinfo-> | ||
+ | // Распечатали имя найденного файла | ||
+ | cout << fileinfo-> | ||
+ | // Пытаемся найти следующий файл из группы | ||
+ | MayWeWork = _findnext(done, | ||
+ | } | ||
+ | // Вывод сообщения о количестве найденных файлов. | ||
+ | cout << " | ||
+ | cout << " file(s) in folder..." | ||
+ | |||
+ | // Очистка памяти | ||
+ | _findclose(done); | ||
+ | delete fileinfo; | ||
+ | } | ||
+ | </ | ||
+ | ====== Операции по работе с директориями ====== | ||
+ | Библиотека direct.h | ||
+ | |||
+ | * int _mkdir( const char *dirname ) | ||
+ | |||
+ | Создает директорию по указанному пути. | ||
+ | |||
+ | dirname - Путь и имя для создаваемой директории. В одно и то же время может быть создан только одна директория. | ||
+ | |||
+ | * int _rmdir( const char *dirname ) | ||
+ | |||
+ | Удаляет директорию по указанному пути. | ||
+ | |||
+ | dirname - Путь и имя для удаляемой директории. | ||
+ | |||
+ | Обе функции возвращают -1 в случае ошибки. | ||
+ | |||
+ | < | ||
+ | < | ||
+ | Удалить и переименовать можно только пустую директорию!!! | ||
+ | </ | ||
+ | |||
+ | Пример на работу с директориями. | ||
+ | < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | using namespace std; | ||
+ | |||
+ | // Переименовать существующую директорию | ||
+ | void RenameDirectory(); | ||
+ | |||
+ | // Удалить существующую директорию | ||
+ | void RemoveDirectory(); | ||
+ | |||
+ | // создать директорию | ||
+ | void CreateDirectory(); | ||
+ | |||
+ | void main() | ||
+ | { | ||
+ | // предлагаем выбрать пункт меню для выполнения | ||
+ | cout << " | ||
+ | |||
+ | // | ||
+ | char ch; | ||
+ | do{ | ||
+ | // Переименовать | ||
+ | cout << "\n1 - Rename\n"; | ||
+ | // Удалить | ||
+ | cout << "2 - Remove\n"; | ||
+ | // Создать | ||
+ | cout << "3 - Create\n"; | ||
+ | // Выход | ||
+ | cout << "0 - Exit\n\n"; | ||
+ | cin >> ch; | ||
+ | |||
+ | // анализируем и вызываем | ||
+ | // соответствующую | ||
+ | switch(ch) | ||
+ | { | ||
+ | case ' | ||
+ | RenameDirectory(); | ||
+ | break; | ||
+ | case ' | ||
+ | RemoveDirectory(); | ||
+ | break; | ||
+ | case ' | ||
+ | CreateDirectory(); | ||
+ | break; | ||
+ | } | ||
+ | } while(ch != ' | ||
+ | } | ||
+ | |||
+ | // Переименовать существующую директорию | ||
+ | void RenameDirectory() | ||
+ | { | ||
+ | char oldName[50], | ||
+ | |||
+ | // В одной переменной запомним существующее имя (oldName), | ||
+ | cout << "Enter old name:"; | ||
+ | cin >> oldName; | ||
+ | |||
+ | // А в другой новое имя(newName) | ||
+ | cout << "Enter new name:"; | ||
+ | cin >> newName; | ||
+ | |||
+ | // Произведем переименование и проверку результата | ||
+ | if (rename(oldName, | ||
+ | cout << " | ||
+ | else | ||
+ | cout << " | ||
+ | } | ||
+ | |||
+ | // Удалить существующую директорию | ||
+ | void RemoveDirectory() | ||
+ | { | ||
+ | char Name[50]; | ||
+ | // Получаем имя и путь к удаляемой директории | ||
+ | cout << "Enter name:"; | ||
+ | cin >> Name; | ||
+ | |||
+ | // | ||
+ | if (_rmdir(Name) == -1) | ||
+ | cout << " | ||
+ | else | ||
+ | cout << " | ||
+ | } | ||
+ | // Создать директорию | ||
+ | void CreateDirectory() | ||
+ | { | ||
+ | char Name[50]; | ||
+ | // Получаем имя и путь к создаваемой директории | ||
+ | cout << "Enter name:"; | ||
+ | cin >> Name; | ||
+ | |||
+ | // | ||
+ | if (_mkdir(Name) == -1) | ||
+ | cout << " | ||
+ | else | ||
+ | cout << " | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====== Практический пример. Показ содержимого директории. ====== | ||
+ | Пример программы осуществляющей показ содержимого директории. Программа при запуске показывает содержимое текущей директории, | ||
+ | |||
+ | cd Путь - переход в другую директорию. | ||
+ | < | ||
+ | cd .. - показ содержимого родительского каталога и переход. | ||
+ | cd или cd . - показ содержимого текущего каталога. | ||
+ | exit - выход из программы. | ||
+ | root - переход в корневой каталог. | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | using namespace std; | ||
+ | |||
+ | const int size=255; | ||
+ | |||
+ | // Функция, | ||
+ | void RemoveRSpacesAndRSlashes(char *str){ | ||
+ | int index=strlen(str)-1; | ||
+ | while(str[index]==' | ||
+ | index--; | ||
+ | } | ||
+ | strncpy(str, | ||
+ | str[index+1]=' | ||
+ | } | ||
+ | // Функция для показа текущей директории | ||
+ | void ShowCurrentDir(char path[],char temp[]){ | ||
+ | CharToOem(path, | ||
+ | printf(" | ||
+ | } | ||
+ | // Функция перевода из кодировки | ||
+ | // Windows в кодировку DOS | ||
+ | // Для корректного отображения | ||
+ | // кирилицы | ||
+ | void RussianMessage(char path[]){ | ||
+ | CharToOem(path, | ||
+ | } | ||
+ | |||
+ | // Показ на экран содержимого папки | ||
+ | bool ShowDir(char path[]){ | ||
+ | // Показ содержимого текущей директории | ||
+ | _finddata_t find; | ||
+ | char pathfind[MAX_PATH]; | ||
+ | strcpy(pathfind, | ||
+ | strcat(pathfind," | ||
+ | char info[MAX_PATH]; | ||
+ | |||
+ | // Начало Поиска | ||
+ | int result=_findfirst(pathfind,& | ||
+ | // Очистка экрана | ||
+ | system(" | ||
+ | int flag=result; | ||
+ | if (flag==-1) { | ||
+ | strcpy(info," | ||
+ | RussianMessage(info); | ||
+ | printf(" | ||
+ | return false; | ||
+ | } | ||
+ | |||
+ | while(flag!=-1){ | ||
+ | |||
+ | if(strcmp(find.name," | ||
+ | // Проверяем Директория или Нет | ||
+ | find.attrib& | ||
+ | RussianMessage(info); | ||
+ | RussianMessage(find.name); | ||
+ | printf(" | ||
+ | } | ||
+ | // Продолжаем Поиск | ||
+ | flag=_findnext(result,& | ||
+ | } | ||
+ | |||
+ | ShowCurrentDir(path, | ||
+ | // Очищаем ресурсы, | ||
+ | _findclose(result); | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | void main(){ | ||
+ | // В данной переменной будет храниться путь к Директории | ||
+ | char path[MAX_PATH]; | ||
+ | // В данной переменной будет команда, | ||
+ | char action[size]; | ||
+ | // Временная переменная | ||
+ | char temp[MAX_PATH]; | ||
+ | // Получаем Путь к текущей Директории | ||
+ | GetCurrentDirectory(sizeof(path), | ||
+ | |||
+ | bool flag=true; | ||
+ | |||
+ | // Показ содержимого текущей директории | ||
+ | ShowDir(path); | ||
+ | do{ | ||
+ | // Ввод команды пользователя | ||
+ | cin.getline(action, | ||
+ | // Убираем пробелы и слэши справа | ||
+ | RemoveRSpacesAndRSlashes(action); | ||
+ | // Переход в корневой каталог | ||
+ | if(!strcmpi(action," | ||
+ | path[2]=' | ||
+ | ShowDir(path); | ||
+ | } | ||
+ | // Проверка на желание пользователя выйти | ||
+ | else if(!strcmpi(action," | ||
+ | flag=false; | ||
+ | } | ||
+ | // Проверка на команду cd | ||
+ | else if(!strnicmp(action," | ||
+ | // Показ содержимого текущей директории | ||
+ | if((!strcmpi(action," | ||
+ | // Показ Директории | ||
+ | ShowDir(path); | ||
+ | } | ||
+ | // Команда cd была дана с параметрами | ||
+ | else if(!strnicmp(action," | ||
+ | // Находим индекс параметра | ||
+ | int index=strspn(action+2," | ||
+ | if(index){ | ||
+ | // Проверка на полный путь к Директории | ||
+ | if(strchr(action+index+2,':' | ||
+ | // Попытка отобразить содержимое Директории | ||
+ | if(ShowDir(action+index+2)){ | ||
+ | strcpy(path, | ||
+ | } | ||
+ | else{ | ||
+ | // Произошла Ошибка | ||
+ | ShowCurrentDir(path, | ||
+ | } | ||
+ | } | ||
+ | // Поднимаемся в родительский каталог | ||
+ | else if(!strcmp(action+index+2," | ||
+ | char *result=strrchr(path,' | ||
+ | if(result){ | ||
+ | int delta=result-path; | ||
+ | strncpy(temp, | ||
+ | temp[delta]=' | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(temp, | ||
+ | } | ||
+ | |||
+ | if(ShowDir(temp)){ | ||
+ | strcpy(path, | ||
+ | } | ||
+ | else{ | ||
+ | // Произошла Ошибка | ||
+ | ShowCurrentDir(path, | ||
+ | } | ||
+ | } | ||
+ | // Показ Директории | ||
+ | else if(!strcmp(action+index+2," | ||
+ | ShowDir(path); | ||
+ | } | ||
+ | else if(!strcmp(action+index+2,"/" | ||
+ | ShowDir(path); | ||
+ | } | ||
+ | else{ | ||
+ | // Был Дан неполный путь | ||
+ | strcpy(temp, | ||
+ | strcat(temp," | ||
+ | strcat(temp, | ||
+ | // Попытка отобразить содержимое Директории | ||
+ | if(ShowDir(temp)){ | ||
+ | strcpy(path, | ||
+ | } | ||
+ | else{ | ||
+ | // Произошла Ошибка | ||
+ | ShowCurrentDir(path, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | else{ | ||
+ | // Показ Директории | ||
+ | ShowDir(path); | ||
+ | } | ||
+ | } | ||
+ | else{ | ||
+ | // Показ Директории | ||
+ | ShowDir(path); | ||
+ | } | ||
+ | } | ||
+ | else{ | ||
+ | // Показ Директории | ||
+ | ShowDir(path); | ||
+ | } | ||
+ | }while(flag); | ||
+ | |||
+ | } | ||
+ | </ | ||
📌 Удобный подбор VPS по параметрам доступен на DIEGfinder.com - официальном инструменте проекта DIEG. Это часть единой экосистемы, созданной для того, чтобы помочь быстро найти подходящий VPS/VDS сервер для любых задач хостинга.
📌 Для тестирования скриптов, установщиков VPN и Python-ботов рекомендуем использовать надежные VPS на короткий срок. Подробнее о быстрой аренде VPS для экспериментов - читайте здесь.
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Nginx простые примеры конфигурации
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах
7 Самых Популярных Обзоров
- Хостинг для Python-скриптов и приложений
- ТОП 4 лучших антидетект браузеров (Бесплатные & Платные)
- Подборка купонов (промокоды) на хостинг, антидетект браузеры
- Обзор THE.Hosting (PQ Hosting): надежный хостинг с профессиональной поддержкой
- Хостинг в России
- Хостинг в Европе
- Обзор браузера Dolphin {anty} для мультиаккаунтинга