C++Builder 6 - чтение директории |
Здравствуйте, гость ( Вход | Регистрация )
C++Builder 6 - чтение директории |
12.06.2005 - 22:05
Вставить ник | Быстрая цитата | Сообщение
#1
|
|
Постоялец форума Группа: Участник Сообщений: 978 Регистрация: 15.04.2004 Пользователь №: 3224 |
Пишу небольшое приложение на C++Builder 6. Споткнулся на такой проблеме. Нужно:
1 - прочитать содержимое директории; 2 - выбрать файлы с определенным расширением; 3 - произвести некоторые изменения в этих файлах. Все это должно происходить "незаметно" для пользователя, без вывода списка файлов в разные ListBox'ы. Пользователю только выдается сообщение о завершении процедуры. Пункт 3 не вызывает проблем. А вот с 1 и 2 они есть. Во всей литературе по С++ и C++Builder 6 не нашел, например, ни одного описания функций для чтения содержимого директории. В Яндексе нашел только одну ссылку. Может кто-то поделится информацией или ссылками? |
|
|
12.06.2005 - 22:18
Вставить ник | Быстрая цитата | Сообщение
#2
|
|
Постоялец форума Группа: Участник Сообщений: 548 Регистрация: 7.11.2003 Пользователь №: 822 |
FindFirstFile
FindNextFile рекурсия |
|
|
13.06.2005 - 11:22
Вставить ник | Быстрая цитата | Сообщение
#3
|
||
Постоялец форума Группа: Участник Сообщений: 518 Регистрация: 27.09.2004 Пользователь №: 4818 |
Код WIN32_FIND_DATA w;
HANDLE h = FindFirstFile(_T("*"),&w); while(FindNextFile(h,&w)) { //delaem 4to-to } FindClose(h);[/code] barberan добавил(а) в нет данных Вот еще пример, не помню откуда он у меня... Код int GetFoldersList(char* argv) { HANDLE hSearch = NULL; LPWIN32_FIND_DATA lpFindData; lpFindData = (WIN32_FIND_DATA *) malloc(sizeof(WIN32_FIND_DATA)); ZeroMemory(lpFindData, sizeof(WIN32_FIND_DATA)); hSearch = FindFirstFile(argv, lpFindData); char c2[256]=""; //printf("%s\n",argv); if(hSearch != INVALID_HANDLE_VALUE) { do { if(strcmp(".", lpFindData->cFileName) && strcmp("..", lpFindData->cFileName) ) { if((FILE_ATTRIBUTE_DIRECTORY & lpFindData->dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY) { ZeroMemory(c2,sizeof(char)*256); strncpy(c2,argv,strlen(argv)-3); strcat(c2,lpFindData->cFileName); folders.push_back(c2); strcat(c2,"\\*.*"); printf("%s,",c2); GetFoldersList(c2); } } FindNextFile(hSearch, lpFindData); } while(GetLastError() != ERROR_NO_MORE_FILES); } return 0; } Сообщение отредактировано barberan - 13.06.2005 - 11:21 |
|
|
||
Guest_TeXник_* |
13.06.2005 - 11:45
| Быстрая цитата | Сообщение
#4
|
Гости |
Код #include "stdlib.h" #include "stdio.h" #include "string.h" #include <io.h> int main( int argc, char* argv[] ) { struct _finddata_t c_file; long hFile; char mask[64] = "*.mp3"; if (argc > 1) { strcpy(mask, argv[1]); } if( (hFile = _findfirst( mask, &c_file )) == -1L ) { printf( "No %s files in current directory!\n", mask ); return -1; } for(;;) { char* nm = c_file.name; if( *nm != '.' ) { printf("%s\n", nm); } if( _findnext( hFile, &c_file ) ) break; } _findclose( hFile ); return 0; } вот ещё пример - прога, вызываемая из командоной строки с одним не обязательным параметром - маской поиска, выдающая список файлов в текущей папке. по умолчанию маска - мп3 файлы. сам чё надо переделывай |
|
|
13.06.2005 - 16:51
Вставить ник | Быстрая цитата | Сообщение
#5
|
|
Постоялец форума Группа: Участник Сообщений: 978 Регистрация: 15.04.2004 Пользователь №: 3224 |
В итоге у меня получилось гораздо проще приведенных выше примеров:
1. Создал DirectoryListBox. 2. Создал FileListBox, сделал его свойство Visible = false. 3. В свойствах FileListBox сразу установил нужное значение Mask. Весь код выглядит так: Код int i = 0;
for (i = 0; i < FileListBox1->Count; i++) { AnsiString df = DirectoryListBox1->Directory + "\\" + FileListBox1->Items->Strings[i]; TStringList *strk1 = new TStringList; strk1->LoadFromFile(df); strk1->Strings[0] = Edit1->Text; strk1->SaveToFile(df); } Сообщение отредактировано avtor - 13.06.2005 - 16:53 |
|
|
Guest_Укуренный_идиот_* |
14.06.2005 - 10:13
| Быстрая цитата | Сообщение
#6
|
Гости |
2 Privacy:
Ну куда ты со своим винапи, вон человек сразу нашел компонент |
|
|
14.06.2005 - 10:35
Вставить ник | Быстрая цитата | Сообщение
#7
|
|
Постоялец форума Группа: Участник Сообщений: 978 Регистрация: 15.04.2004 Пользователь №: 3224 |
Добавил к приведенному коду еще небольшой фрагмент - и в итоге сделал себе заменитель файлового менеджера FAR для web-программирования на Perl. Раньше, делая сайты на Perl, приходилось перед их перемещением со своего компьютера на сервер менять строку пути к интерпретатору и формат из Win в Unix. А это порядка 40 -60 файлов, то есть работы на час. Теперь вся процедура занимает не более 1 минуты. Выбрал директорию, ввел текст нового пути к интерпретатору, нажал кнопку - и через 2 секунды все готово.
|
|
|
Guest_Укуренный_идиот_* |
14.06.2005 - 11:12
| Быстрая цитата | Сообщение
#8
|
Гости |
Ммм... А на столь обожаемом Вами перле такую программку сваять нельзя было давным давно? Это ж просто, как **ем по столу... И никаких билдеров не надо
|
|
|
14.06.2005 - 11:28
Вставить ник | Быстрая цитата | Сообщение
#9
|
|
Постоялец форума Группа: Участник Сообщений: 978 Регистрация: 15.04.2004 Пользователь №: 3224 |
Цитата(Укуренный_идиот @ 14.06.2005 - 12:12) Ммм... А на столь обожаемом Вами перле такую программку сваять нельзя было давным давно? Это ж просто, как **ем по столу... И никаких билдеров не надо Естественно, можно. Но эта программа работала бы либо через посредство локального сервера (то есть, надо запускать сервер, перемещать файлы в localhost, запускать браузер и т.д.), либо из командной строки (что мне в принципе не нравится, как кому-то не нравятся, допустим мелодрамы в кино). Таким образом, на С++ Builder - самый приятный вариант, самый простой и быстрый, самый ленивый. |
|
|
Текстовая версия | Сейчас: 9.09.2024 - 23:48 |