powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Нужны все файлы
25 сообщений из 30, страница 1 из 2
Нужны все файлы
    #34970346
Glad_r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе время суток Уважаемые.
Подскажите пожалуйста вот в такой задачке. Есть директория (Пусть будет D:\My\Prog\) в которой находятся несколько папок и файлов, то есть дерево вот такое
D:\My\Prog\
|-SQL (Directory)
|- Work (Directory)
|- Source (Directory)
|- temp.dbf
|- proga.prg

В каждой папке есть ещё одна вложенная папка с файлами. Нужно в итоге получить файл со всеми файлами и путями к ним, что-то вида
D:\My\Prog\temp.dbf
D:\My\Prog\proga.prg
D:\My\Prog\SQL\Files\zapros.dbf
D:\My\Prog\SQL\Files\zapros.prg
D:\My\Prog\SQL\Files\zapros.bak
и так далее. Сначала пробовал всё вытащить через ADIR()
Потом если есть (Directory), то переходил на новый уровень и там ADIR(), но помоему так не рационально, куча файлов получается, которые потом сливать в один приходится. Подскажите, может есть другой алгоритм.
...
Рейтинг: 0 / 0
Нужны все файлы
    #34970366
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, все правильно.
________
Не дадим распространиться заразе политкорректности!
...
Рейтинг: 0 / 0
Нужны все файлы
    #34970447
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, да. Если действовать стандартно, то только рекурсией. Однако вместе с FoxPro поставляется библиотека Filer.dll. Она находится в директории Tools\Filer корневой директории FoxPro. Так вот, с ее помощью, эту задачу можно решить так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
oMyFiler = CREATEOBJECT('Filer.FileUtil')
oMyFiler.SearchPath = "D:\My\Prog\"
oMyFiler.FileExpression = '*.*'
oMyFiler.Find( 0 )
FOR nFileCount =  1  TO oMyFiler.Files.Count
   ?oMyFiler.Files.Item(nFileCount).Name
ENDFOR

Отделить директории от файлов можно по значению свойства attr. Полное описание свойств и методов этой библиотеки есть в HELP по VFP

Filer.dll

Правда, в этом случае данную библиотеку надо будет поставлять клиенту и регистрировать на машине клиента.
...
Рейтинг: 0 / 0
Нужны все файлы
    #34970524
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glad_r...
Потом если есть (Directory), то переходил на новый уровень и там ADIR(), но помоему так не рационально, куча файлов получается, которые потом сливать в один приходится. Подскажите, может есть другой алгоритм.
Деревья рекурсией обрабатываются лучше всего. Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create cursor tfiles (cPath c( 250 ), cFile c( 250 ))
ListFile('c:\MyFolder\')
brow
return

proc ListFile
lpara tcFolder
local array laF[ 2 ]
local i
for i =  1  to ADIR(laF)
     if laF[i] = файл
         insert into tfiles (cPath, cFile) values (tcFolder, laF[i])
     else
         * Папка
         ListFile(tcFolder + laF[i] + '\')
     endif
endfor
return
Структуру массива после ADIR() точно не помню, поправь синтаксис сам.
...
Рейтинг: 0 / 0
Нужны все файлы
    #34970552
foxwizard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глянь тут

http://www.universalthread.com/

XDIR Recursive Directory Scan

Download the file

xdir.zip

Summary

Class effectively scans drives/directory, firing an event/methods for each subdirectory and file within. Using this class, you can do variety of directory/files processing tasks. Freeware/Source/Samples Included.
Check out; Mass FRX CleanUp, Folder Preview/Print, File Search, XCopy etc.
Ссылка:

http://]www.universalthread.com/wconnect/wc.dll?2,2,25487
...
Рейтинг: 0 / 0
Нужны все файлы
    #34973339
Glad_r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем. Всё работает!!!!
Использовал Filer.
...
Рейтинг: 0 / 0
Нужны все файлы
    #35338102
bodrox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного видоизменим:
Есть директория (Пусть будет D:\My\Prog\) в которой находятся несколько папок и файлов, то есть дерево вот такое
D:\My\Prog\
|-SQL (Directory)
|- Work (Directory)
|- Source (Directory)
|- temp.dbf
|- proga.prg

В каждой папке есть ещё одна вложенная папка с файлами. Нужно в итоге получить массив со всеми папками, файлами и путями к ним, что-то вида
D:\My\Prog
D:\My\Prog\temp.dbf
D:\My\Prog\proga.prg
D:\My\Prog\SQL\Files\zapros.dbf
D:\My\Prog\SQL\Files\zapros.prg
D:\My\Prog\SQL\Files\zapros.bak
и так далее.
В папке D:\My есть ещё много папок, но нужно получить в массиве саму папку и её содержимое, но только её.
Какие параметры задать ADIR'у?
...
Рейтинг: 0 / 0
Нужны все файлы
    #35338108
bodrox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADIR понимает простые wildcards, а вот что-нить хотя бы ФАРовское - не знаю как там применить.... Да возможно ли вообще?
--------------
Новичок в VFOX
...
Рейтинг: 0 / 0
Нужны все файлы
    #35338309
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bodroxНемного видоизменим:
...
Ничего не понял. Что видоизменилось?
По второму разу тот же вопрос?
...
Рейтинг: 0 / 0
Нужны все файлы
    #35338751
Alexis777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А чем досовская команда dir не устраивает?
С перенаправлением вывода в файл, или
использование Windows script host
...
Рейтинг: 0 / 0
Нужны все файлы
    #35339119
bodrox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T bodroxНемного видоизменим:
...
Ничего не понял. Что видоизменилось?
По второму разу тот же вопрос?В массив попала сама папка D:\My\Prog
...
Рейтинг: 0 / 0
Нужны все файлы
    #35339187
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bodroxВ массив попала сама папка D:\My\Prog
Подробно лень писать? Если попала - пропусти ее при обработке.

ADIR() по умолчанию папки не берет, если только принудительно не указывать что надо папки брать, т.е. третий параметр "D"

Я выше код рекурсивной обработки подпапок приводил, вот законченный вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create cursor tfiles (cPath c( 250 ), cFile c( 250 ))
ListFile('D:\My\Prog\')
brow
return

proc ListFile
lpara tcFolder
local array laF[ 2 ]
local i
tcFolder = addbs(tcFolder)
for i =  1  to ADIR(laF, tcFolder + '*.*', 'D',  1 )
     if at('D', laF[i,  5 ]) =  0  && это файл
         insert into tfiles (cPath, cFile) values (tcFolder, laF[i,  1 ])
     else
         * Папка
         if !inlist(laF[i,  1 ], '.', '..')
	         ListFile(tcFolder + laF[i,  1 ]) && Обработка подпапки
	     endif
     endif
endfor
return

Запусти, разберись как работает и переделай под свою задачу.
...
Рейтинг: 0 / 0
Нужны все файлы
    #35339691
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И без рекурсии, одним циклом решается эта задачка
...
Рейтинг: 0 / 0
Нужны все файлы
    #35339710
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сори, двумя конечно
...
Рейтинг: 0 / 0
Нужны все файлы
    #35339784
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
set talk off
adirc("files")
select files
brow norm

*-----------------------------------------------------------------------------
* lib.file.adirc(cAlias, [cMask], [cParam])
*
* cAlias Курсор:
* file M(4)
* size N(16)
* date D(8)
* time C(8)
* attributes C(5)
* [cMask] [Путь и] маска искомых файлов (по-умолчанию - все файлы)
* [cParam] 'S' - без файлов текущей директории (только поддиректории)
* 'D' - отбирать как файлы, так и директории (по-умолчанию только файлы)
* Возвращает кол-во отобранных файлов [и директорий]
*
* + обрабатывает все поддиректории, не содержит рекурсии;
* + не имеет ограничения 64K на предельное количество файлов (возвращает курсор);
* + позволяет накачивать файлы в один курсор последовательными вызовами;
* + в имени файлов возвращается полный путь и имя файла;
* + возвращает корректные размеры для файлов больше 4GB;
* + не имеет ограничения на длину пути файлов;
* - ограничение на 64535 директорий (может быть устранено заменой массива
* adirs на курсор, но оставлено для быстродействия);
* - ограничение на размер файла 2GB (dbf или fpt), не критично
*-----------------------------------------------------------------------------
#define LONGINT 4294967296

Function adirc
lparameters cAlias, cMask, cParam
local cPath, lDirs, iFilesPtr, iDirsPtr1, iDirsPtr2, lBegin, cCurr, j, i, aCurr[1], cName, lAdd
ok = .t.
if !used(cAlias)
create cursor (cAlias) (;
file M(4) ,;
size N(14) ,;
date D(8) ,;
time C(8) ,;
attributes C(5) )
endif
if vartype(cMask)<>'C'
cMask = "*.*"
endif
if vartype(cParam)<>'C'
cParam = ""
endif

declare integer GetCompressedFileSize IN win32api string cFileName, Integer @lpFileSizeHigh

if ok
local iFileSize, iHigh, iLow, lNoCurrDir
cMask = strtran(alltrim(cMask),"\\","\")
cPath = addbs(justpath(cMask))
cMask = justfname(cMask)
if empty(cMask)
cMask = "*.*"
else
cMask = upper(cMask)
endif
lDirs = 'D'$cParam
lNoCurrDir = 'S'$cParam

local aDirs[1] && стек директорий
aDirs[1] = cPath
iDirsPtr1 = 1 && .. позиция сканирования
iDirsPtr2 = 1 && .. вершина стека

lBegin = .t.
do while ok and iDirsPtr1<=iDirsPtr2
cCurr = aDirs[iDirsPtr1]
j = adir(aCurr, cCurr+"*.*", "DHS", 1)
for i=1 to j
cName = aCurr[i,1]
lAdd = .f.

do case
case !ok
exit
case inlist(cName,".","..")
case 'D'$aCurr[i,5]
iDirsPtr2 = iDirsPtr2 + 1
local aDirs[iDirsPtr2]
aDirs[iDirsPtr2] = cCurr + cName + "\"
if lDirs
lAdd = .t.
endif
case lBegin and lNoCurrDir
case like(cMask,upper(cName))
lAdd = .t.
endcase

if lAdd
iHigh = 0
iLow = GetCompressedFileSize(cCurr+cName,@iHigh)
iFileSize = iif(iLow>=0, iLow, (iHigh+1)*LONGINT + iLow)

insert into (cAlias) values (;
cCurr+cName ,;
iFileSize ,;
aCurr[i,3] ,;
aCurr[i,4] ,;
aCurr[i,5] )
endif
endfor

iDirsPtr1 = iDirsPtr1 + 1
lBegin = .f.
enddo
endif

return ok
...
Рейтинг: 0 / 0
Нужны все файлы
    #35339810
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, забыл про тег SRC ;)
Во вложении то же самое
...
Рейтинг: 0 / 0
Нужны все файлы
    #35339979
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bodroxВ массив попала сама папка D:\My\Prog
Если нужны пути относительно начальной папки, то для этого есть функция SYS(2014)
Код: plaintext
? SYS( 2014 , 'D:\My\Prog\Source', 'D:\My\Prog\') && вернет "Source"

XAndyИ без рекурсии, одним циклом решается эта задачка
А чем тебе рекурсия не угодила? Кода в разы меньше и читается он гораздо легче.
...
Рейтинг: 0 / 0
Нужны все файлы
    #35340131
bodrox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что мне нужно возвращает ADIR(AFILES1,'D:\My\*.*','AHRSD'), но он также передаст в массив AFILES1 все папки из D:\My и содержимое этих папок. А мне только нужно чтобы была папка D:\My\Prog и её содержимое, но ADIR(AFILES1,'D:\My\Prog\*.*','AHRSD') вернёт мне только содержимое D:\My\Prog\, а саму папку D:\My\Prog - нет.
--------------
Новичок в VFOX
...
Рейтинг: 0 / 0
Нужны все файлы
    #35340313
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bodroxЧто мне нужно возвращает ADIR(AFILES1,'D:\My\*.*','AHRSD'), но он также передаст в массив AFILES1 все папки из D:\My и содержимое этих папок. А мне только нужно чтобы была папка D:\My\Prog и её содержимое, но ADIR(AFILES1,'D:\My\Prog\*.*','AHRSD') вернёт мне только содержимое D:\My\Prog\, а саму папку D:\My\Prog - нет.
Странные у тебя желания: то что в первом случае 'D:\My\' не вернет это нормально, а то что во втором случае 'D:\My\Prog' - ненормально.

ADIR() возвращает список файлов/подпапок без полного пути по заданному шаблону. Этого достаточно. Если тебе надо чтобы еще была запись (элемент массива) с полным путем до просматриваемой папки, то добавь ее отдельно, пропиши это руками, просматриваемая папка известна, т.к. она как параметр в ADIR() идет.
Да и зачем элемент "D:\My\Prog" нужен в массиве совсем непонятно, мне никогда такого не надо было, а то при каждом использовании ADIR() надо было бы этот элемент ловить чтобы пропустить.

Складывается впечатление что ты что-то написать хочешь совсем не так как это принято делать. Выкладывай пример кода который у тебя есть (много не надо, сделай отдельный пример законченный), и напиши что не получается. Тогда понятно будет что не так ты делаешь
...
Рейтинг: 0 / 0
Нужны все файлы
    #35340350
bodrox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shm_zip2.... Он сжимает содержимое папки, а не саму папку.
--------------
Новичок в VFOX
...
Рейтинг: 0 / 0
Нужны все файлы
    #35340376
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bodroxshm_zip2....

Все прекрасно знают что это такое, т.к. каждый день только это и используют

Хочешь чтобы помогли, описывай проблему, не хочешь писать, извини, ясновидящих тут нет.
...
Рейтинг: 0 / 0
Нужны все файлы
    #35340423
bodrox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем, shm_zip2 - класс, жмёт в ZIP без внешнего архиватора.
В качестве параметра передаётся полный путь до папки.
Внутри класса это пережёвывает ADIR.
Получается так, что в архив попадает только содержимое папки, но не она сама.

Зайдите в папку любую в проводнике. Выделите все файлы, контекстное меню - "ВинРАР" - "Добавить в архив". Перейдите на уровень выше. Выделите папку, в которой только что сжимали файлы, контекстное меню - "ВинРАР" - "Добавить в архив". Первый архив - это как раз то, как работает ADIR, второй архив - то, как надо мне.


Вот на фоксклабе класс shm_zip2 http://www.foxclub.ru/sol/solution450.php
Собирается содержимое в методе xdir().
--------------
Новичок в VFOX
...
Рейтинг: 0 / 0
Нужны все файлы
    #35340575
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bodroxВобщем, shm_zip2 - класс, жмёт в ZIP без внешнего архиватора.
А zlibwapi.dll тогда что?

ADIR() тут вовсе не причем.
В метод xzip() вторым параметром передается путь к имени файла внутри архива, тут и править надо. Поправь вызов из ZipDir()
Код: plaintext
1.
2.
3.
4.
5.
6.
	this.xzip(this.input_path+this.axdir(k, 1 ), ;
		substr(this.input_path, rat('\', this.input_path,  2 ) +  1 ) + this.axdir(k, 1 ), ;
		this.axdir(k, 2 ), ;
		this.axdir(k, 3 ), ;
		this.axdir(k, 4 ), ;
		this.axdir(k, 5 ))
...
Рейтинг: 0 / 0
Нужны все файлы
    #35340631
bodrox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T bodroxВобщем, shm_zip2 - класс, жмёт в ZIP без внешнего архиватора.
А zlibwapi.dll тогда что?

ADIR() тут вовсе не причем.
В метод xzip() вторым параметром передается путь к имени файла внутри архива, тут и править надо. Поправь вызов из ZipDir()
Код: plaintext
1.
2.
3.
4.
5.
6.
	this.xzip(this.input_path+this.axdir(k, 1 ), ;
		substr(this.input_path, rat('\', this.input_path,  2 ) +  1 ) + this.axdir(k, 1 ), ;
		this.axdir(k, 2 ), ;
		this.axdir(k, 3 ), ;
		this.axdir(k, 4 ), ;
		this.axdir(k, 5 ))
Оригинально :). Спасибо. Просто я посчитал, что надо поправить список файлов и папок в xdir'е собираемые.
...
Рейтинг: 0 / 0
Нужны все файлы
    #35340663
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bodroxОригинально :). Спасибо. Просто я посчитал, что надо поправить список файлов и папок в xdir'е собираемые.
Если бы ты его поправил, то по this.input_path+this.axdir(k,1) получалось бы имя несуществующего файла.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Нужны все файлы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]