Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Foxpro/Clipper/Dbase > Программное определение вложенных подкаталогов


Автор: Cashey 20.8.2004, 21:52
Всем привет! Сталкнулся с такой задачей, есть потребность программно определить все подкаталоги (включая многократно вложенные) в заданной директории, их количество и название. Да вот что-то я не нашел подходящей ф-ции, которая бы возвращала бы название подкаталога и вообще возвращала бы информацию о его наличии.

Автор: oks 7.12.2004, 09:45
Если речь о Fox, то есть такая функция как ADIR() , которая закидывает информацию о файлах и папках, содержащихся в заданной или текущей папке, в массив. При передаче третьего параметра "d" учитывает вложенность.
У меня-то несколько иной вопрос - есть ли в Fox оператор или функция, определяющая размер заданной папки.

Автор: Cashey 8.12.2004, 01:21
oks читай внимательно вопрос! ф-ция ADIR() возвращает информацию о файлах, но не может быть использованна для заполнения установки SET PATH, т.к. не выделяет каталоги. Можно конечено попробовать пробежаться циклом, анализируя атрибут "D". Я попробую.

Цитата(oks @ 7.12.2004, 09:45)
У меня-то несколько иной вопрос - есть ли в Fox оператор или функция, определяющая размер заданной папки.

А вот эту задачу как раз можно решить с помощью ADIR(). Занести в массив информацию о файлах и пробежавшись циклом по массиву сложить их размер (размерность файла - это второй столбец полученного массива)

Автор: oks 8.12.2004, 08:11
и все же согласись, что наши задачи имееют одно и то же решение smile
а с циклом-то конечно можно, хотелось проще smile

Автор: Cashey 9.12.2004, 00:33
Цитата(oks @ 8.12.2004, 08:11)
и все же согласись, что наши задачи имееют одно и то же решение

Обе задачи связана с работой с каталогами, поэтому неудивительно, что у них может быть однокоренное решения. Но оптимальное решение пока не найдено smile

Автор: AntonSaburov 9.12.2004, 13:54
А разве это не задачка рекурсивного обхода дерева ?

Автор: Cashey 9.12.2004, 23:34
AntonSaburov
???
не вижу в этой задаче ничего рекурсивного, пошаговый обход каталогов...

Автор: AntonSaburov 10.12.2004, 14:04
Цитата(Cashey @ 9.12.2004, 23:34)
не вижу в этой задаче ничего рекурсивного, пошаговый обход каталогов...

Так он как раз и будет рекурсивно вызывать сам себя.

Пример мнемокодом

Код

function GetFiles(String dir, List allFiles)
{
  File[] files=getFilesFromDir(dir)  // здесь получаем список файлов в текущем каталоге
  for(int i=0; i<files.length; i++) {
     // Может сразу здесь добавлять в список - тогда список будет содержать и каталоги тоже
     if(files[i].IsDir()) {
        GetFiles(dir+"\"fiels[i], allFiles);  // ВОТ ЭТОТ РЕКУРСИВНЫЙ ВЫЗОВ
     }
     else {
        allFiles.add(files[i]);  // добавить файл в список. Если нудны ТОЛЬКО файлы
     }
  }  
}

Автор: Cashey 10.12.2004, 18:58
Мне нужны ТОЛЬКО каталоги.

Автор: AntonSaburov 14.12.2004, 15:51
Цитата(Cashey @ 10.12.2004, 18:58)
Мне нужны ТОЛЬКО каталоги.

Ну тогда что-то типа такого

Код

function GetFiles(String dir, List allFiles)
{
 File[] files=getFilesFromDir(dir)  // здесь получаем список файлов в текущем каталоге
 for(int i=0; i<files.length; i++) {
    if(files[i].IsDir()) {  // Если это каталог
       allFiles.add(files[i]);  // добавить каталог в список.
       GetFiles(dir+"\"fiels[i], allFiles);  // ВОТ ЭТОТ РЕКУРСИВНЫЙ ВЫЗОВ
    }
 }  
}

Автор: Cashey 14.12.2004, 22:25
Ну я примерно так и сделал, если это рекурсия, ну и пусть ей и остается? smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)