|
|
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
Доброе время суток Уважаемые. Подскажите пожалуйста вот в такой задачке. Есть директория (Пусть будет 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(), но помоему так не рационально, куча файлов получается, которые потом сливать в один приходится. Подскажите, может есть другой алгоритм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2007, 00:14 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
Нет, все правильно. ________ Не дадим распространиться заразе политкорректности! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2007, 01:03 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
В общем, да. Если действовать стандартно, то только рекурсией. Однако вместе с FoxPro поставляется библиотека Filer.dll. Она находится в директории Tools\Filer корневой директории FoxPro. Так вот, с ее помощью, эту задачу можно решить так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Отделить директории от файлов можно по значению свойства attr. Полное описание свойств и методов этой библиотеки есть в HELP по VFP Filer.dll Правда, в этом случае данную библиотеку надо будет поставлять клиенту и регистрировать на машине клиента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2007, 02:41 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
Glad_r... Потом если есть (Directory), то переходил на новый уровень и там ADIR(), но помоему так не рационально, куча файлов получается, которые потом сливать в один приходится. Подскажите, может есть другой алгоритм. Деревья рекурсией обрабатываются лучше всего. Примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2007, 07:30 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
Глянь тут 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2007, 08:19 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
Спасибо всем. Всё работает!!!! Использовал Filer. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2007, 23:03 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
Немного видоизменим: Есть директория (Пусть будет 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'у? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2008, 16:58 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
ADIR понимает простые wildcards, а вот что-нить хотя бы ФАРовское - не знаю как там применить.... Да возможно ли вообще? -------------- Новичок в VFOX ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2008, 17:00 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
bodroxНемного видоизменим: ... Ничего не понял. Что видоизменилось? По второму разу тот же вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2008, 17:52 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
А чем досовская команда dir не устраивает? С перенаправлением вывода в файл, или использование Windows script host ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2008, 21:56 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
Dima T bodroxНемного видоизменим: ... Ничего не понял. Что видоизменилось? По второму разу тот же вопрос?В массив попала сама папка D:\My\Prog ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2008, 09:03 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
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. Запусти, разберись как работает и переделай под свою задачу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2008, 09:43 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
И без рекурсии, одним циклом решается эта задачка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2008, 12:14 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
сори, двумя конечно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2008, 12:17 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2008, 12:39 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
Сорри, забыл про тег SRC ;) Во вложении то же самое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2008, 12:44 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
bodroxВ массив попала сама папка D:\My\Prog Если нужны пути относительно начальной папки, то для этого есть функция SYS(2014) Код: plaintext XAndyИ без рекурсии, одним циклом решается эта задачка А чем тебе рекурсия не угодила? Кода в разы меньше и читается он гораздо легче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2008, 13:18 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
Что мне нужно возвращает ADIR(AFILES1,'D:\My\*.*','AHRSD'), но он также передаст в массив AFILES1 все папки из D:\My и содержимое этих папок. А мне только нужно чтобы была папка D:\My\Prog и её содержимое, но ADIR(AFILES1,'D:\My\Prog\*.*','AHRSD') вернёт мне только содержимое D:\My\Prog\, а саму папку D:\My\Prog - нет. -------------- Новичок в VFOX ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2008, 13:55 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
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() надо было бы этот элемент ловить чтобы пропустить. Складывается впечатление что ты что-то написать хочешь совсем не так как это принято делать. Выкладывай пример кода который у тебя есть (много не надо, сделай отдельный пример законченный), и напиши что не получается. Тогда понятно будет что не так ты делаешь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2008, 14:40 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
shm_zip2.... Он сжимает содержимое папки, а не саму папку. -------------- Новичок в VFOX ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2008, 14:50 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
bodroxshm_zip2.... Все прекрасно знают что это такое, т.к. каждый день только это и используют Хочешь чтобы помогли, описывай проблему, не хочешь писать, извини, ясновидящих тут нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2008, 14:59 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
Вобщем, shm_zip2 - класс, жмёт в ZIP без внешнего архиватора. В качестве параметра передаётся полный путь до папки. Внутри класса это пережёвывает ADIR. Получается так, что в архив попадает только содержимое папки, но не она сама. Зайдите в папку любую в проводнике. Выделите все файлы, контекстное меню - "ВинРАР" - "Добавить в архив". Перейдите на уровень выше. Выделите папку, в которой только что сжимали файлы, контекстное меню - "ВинРАР" - "Добавить в архив". Первый архив - это как раз то, как работает ADIR, второй архив - то, как надо мне. Вот на фоксклабе класс shm_zip2 http://www.foxclub.ru/sol/solution450.php Собирается содержимое в методе xdir(). -------------- Новичок в VFOX ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2008, 15:09 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
bodroxВобщем, shm_zip2 - класс, жмёт в ZIP без внешнего архиватора. А zlibwapi.dll тогда что? ADIR() тут вовсе не причем. В метод xzip() вторым параметром передается путь к имени файла внутри архива, тут и править надо. Поправь вызов из ZipDir() Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2008, 15:52 |
|
||
|
Нужны все файлы
|
|||
|---|---|---|---|
|
#18+
Dima T bodroxВобщем, shm_zip2 - класс, жмёт в ZIP без внешнего архиватора. А zlibwapi.dll тогда что? ADIR() тут вовсе не причем. В метод xzip() вторым параметром передается путь к имени файла внутри архива, тут и править надо. Поправь вызов из ZipDir() Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2008, 16:06 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=35339691&tid=1587732]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 191ms |
| total: | 348ms |

| 0 / 0 |
