Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> C++Builder 6 - чтение директории
avtor
сообщение 12.06.2005 - 22:05

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Пишу небольшое приложение на C++Builder 6. Споткнулся на такой проблеме. Нужно:
1 - прочитать содержимое директории;
2 - выбрать файлы с определенным расширением;
3 - произвести некоторые изменения в этих файлах.
Все это должно происходить "незаметно" для пользователя, без вывода списка файлов в разные ListBox'ы. Пользователю только выдается сообщение о завершении процедуры.
Пункт 3 не вызывает проблем. А вот с 1 и 2 они есть. Во всей литературе по С++ и C++Builder 6 не нашел, например, ни одного описания функций для чтения содержимого директории. В Яндексе нашел только одну ссылку. Может кто-то поделится информацией или ссылками?
Перейти в начало страницы
 
+Цитировать сообщение
[Privacy]
сообщение 12.06.2005 - 22:18

Постоялец форума
*****

Группа: Участник
Сообщений: 548
Регистрация: 7.11.2003
Пользователь №: 822


FindFirstFile
FindNextFile
рекурсия
Перейти в начало страницы
 
+Цитировать сообщение
barberan
сообщение 13.06.2005 - 11:22

Постоялец форума
*****

Группа: Участник
Сообщений: 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 добавил(а) в нет данных
Вот еще пример, не помню откуда он у меня... g.gif
Код

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 файлы. сам чё надо переделывай
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 13.06.2005 - 16:51

Постоялец форума
*****

Группа: Участник
Сообщений: 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:
Ну куда ты со своим винапи, вон человек сразу нашел компонент wink.gif
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 14.06.2005 - 10:35

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Добавил к приведенному коду еще небольшой фрагмент - и в итоге сделал себе заменитель файлового менеджера FAR для web-программирования на Perl. Раньше, делая сайты на Perl, приходилось перед их перемещением со своего компьютера на сервер менять строку пути к интерпретатору и формат из Win в Unix. А это порядка 40 -60 файлов, то есть работы на час. Теперь вся процедура занимает не более 1 минуты. Выбрал директорию, ввел текст нового пути к интерпретатору, нажал кнопку - и через 2 секунды все готово.
Перейти в начало страницы
 
+Цитировать сообщение
Guest_Укуренный_идиот_*
сообщение 14.06.2005 - 11:12
| Быстрая цитата | Сообщение #8


Гости





Ммм... А на столь обожаемом Вами перле такую программку сваять нельзя было давным давно? wink.gif Это ж просто, как **ем по столу... И никаких билдеров не надо wink.gif
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 14.06.2005 - 11:28

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Цитата(Укуренный_идиот @ 14.06.2005 - 12:12)
Ммм... А на столь обожаемом Вами перле такую программку сваять нельзя было давным давно? wink.gif Это ж просто, как **ем по столу... И никаких билдеров не надо wink.gif

Естественно, можно. Но эта программа работала бы либо через посредство локального сервера (то есть, надо запускать сервер, перемещать файлы в localhost, запускать браузер и т.д.), либо из командной строки (что мне в принципе не нравится, как кому-то не нравятся, допустим мелодрамы в кино). Таким образом, на С++ Builder - самый приятный вариант, самый простой и быстрый, самый ленивый.
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 9.09.2024 - 23:48