Форум » [x]Harbour » Перенос папок ? » Ответить

Перенос папок ?

Andrey: Всем привет. Подскажите как можно определенную ПАПКУ перенести на другой диск ? Т.е. имеем ПАПКУ начального уровня, а сколько там еще папок и файлов не известно ! И как эту папку со всем содержимым перенести на другой диск ? Файлы легко переносятся, а вот с папками затык получается.... Может у кого есть готовое решение ?

Ответов - 71, стр: 1 2 3 4 All

Dima: Модифицируй :) http://clipper.borda.ru/?1-1-0-00000230-000-0-0-1280143627

AlexMyr: Еще как вариант запустить архиватор, сжать, перенести, распаковать.

Pasha: AlexMyr пишет: Еще как вариант запустить архиватор, сжать, перенести, распаковать. Использование протезов - это не наш метод. Мы делаем все своими руками Перенос папок - это копирование с рекурсивным обходом и удаление. Так и надо копировать и удалять, делов то


AlexMyr: Pasha пишет: Использование протезов - это не наш метод. Мы делаем все своими руками Перенос папок - это копирование с рекурсивным обходом и удаление. Так и надо копировать и удалять, делов то hbzlib-ом можно попробывать, не объязательно внешним архиватором. А если задача будет перенести определенные папки, файлы - тогда рекурсия. Andrey пишет: Может у кого есть готовое решение ? Видать нету , снова самому.

Andrey: AlexMyr пишет: Видать нету , снова самому. Вот облом то... И никто не делал такие вещи ? Список содержимого ПАПКИ получил. Нашел в хелпе по хХарбору: функция DirectoryRecurse() А как ПАПКИ перемещать ? Как в старые добрые времена... Сначала создаем ПАПКУ на нужном диске, а потом удаляем ПАПКУ на старом месте ??? Это получается все ручками...

AlexMyr: Лучше удалить начальную папку DIRREMOVE( <cDirectory> ) --> nError, после полного переноса всего содержимого папки. Andrey пишет: Это получается все ручками... Вы же делаете из программы резервную копию архиватором, попробуйте задействовать его для переноса. Не проверял function(cpathS,cpathD) hb_processRun( "7z a na1"+ cpaths) копируете куда нужно в cPathD hb_processRun( "7z x"+ "..\"+CpathD+"\na1") DIRREMOVE( cPathS ) --> nError return

Pasha: Andrey пишет: Как в старые добрые времена... Времена всегда одинаковые.

AndreyZh: Вот у меня есть такая функашка... Правда на fox, но посмотрел, что в ней нет фоксовской экзотики... Может пригодится: [pre2] * -------------------------------------------------------------------- #define _MAS 64000 * -------------------------------------------------------------------- * Копирование каталога с файлами и подкаталогами в другую папку procedure zCopyDir parameters cSour, cTarg local nm, lFile, i, n, lEnd, nStart, j, nL, nStep, cDir, cStr local array aArr(_MAS), aD(_MAS), laDir(_MAS) dimension aArr[_MAS], aD[_MAS], laDir[_MAS] * обнуляю значения элементов массива. for i = 1 to _MAS aArr = "" aD = "" next private cpf, cps cSour = Upper(Alltrim(cSour)) cTarg = Upper(Alltrim(cTarg)) nL = 0 nStep = 0 * Проверяю наличие каталога cSour. Если каталога нет - завершаю процедуру nm = fcreate(cSour+"\test") IF nm = -1 retu ELSE fclose(nm) cpf = cSour+"\test" DELETE FILE &cpf ENDIF * Проверяю наличие каталога cTarg. Если каталога нет - создаю его. nm = fcreate(cTarg+"\test") IF nm = -1 cpf = cTarg MKDIR &cpf ELSE fclose(nm) cpf = cTarg+"\test" DELETE FILE &cpf ENDIF * Переносим все подкаталоги с потрохами nStart = 1 lEnd = .f. * Определяю список подкаталогов корневого каталога do aArrDir with cSour,aArr,aD, nL do whil .t. AND nStep <= _MAS nStep = nStep + 1 * Определяю стартовый номер элементы - где еще не описаны каталоги. for i = 1 to _MAS if Empty(aArr) nStart = i-1 exit endif next * Переношу непустые элементы в глобальный массив for i = 1 to _MAS if Empty(aD) exit endif aArr[nStart+i] = aD next * Цикл по общему массиву. Поиск подкаталогов. lEnd = .f. for i = 1 to _MAS if Empty(aArr) loop endif * Обнуляю массив поддиректорий. for j = 1 to _MAS aD[j] = "" next * Заношу информацию в массив поддиректорий do aArrDir with aArr,aArr,aD,nL if nL > 0 && число непустых каталогов. lEnd = .t. exit endif next * Кол-во директорий имеющих подкаталоги стало нулевым. if !lEnd exit endif enddo * Создаем структуру каталогов в папке создаваемых директорий nStep = 1 do whil nStep <= 100 && Максимальный уровень вложенности каталогов * Номер вхождения знака / в имя директории. nStep = nStep + 1 for i = 1 to _MAS if Empty(aArr) loop endif * Нереальная директория. nL = At("\",aArr,nStep) if nL <= 0 loop endif * Выделяю "чистое" имя создаваемого приемного каталога. nL = Len(cSour) cStr = Alltrim(Substr(aArr,nL+1)) cDir = cTarg+cStr * Проверяю наличие нового каталога. Если каталога нет - создаю его. nm = fcreate(cDir+"\test") IF nm = -1 cpf = cDir MKDIR &cpf ELSE fclose(nm) cpf = cDir+"\test" DELETE FILE &cpf ENDIF * Копирую все файлы исходного каталога в каталог получатель. nL = aDir(ad1,cSour+cStr+iif(Right(cDir,1)="\","*.*","\*.*"),"A") for j = 1 to nL if At("A",ad1[j,5]) < 1 loop endif cpf = cSour+cStr+"\"+ad1[j,1] cps = cTarg+cStr+"\"+ad1[j,1] * Проверяю существование файла if !File(cps) copy file &cpf to &cps endif next next enddo retu * ------------------------------------------------------------------------------- * Функция возвращает массив каталогов заданной директории, не входящих в пере- * данной функции уже определенный массив директорий. procedure aArrDir parameters cDir, aD, laDir, nL local n, i, j, c, nCount * обнуляю значения элементов массива. nCount = 0 for i = 1 to _MAS laDir = "" next * Определяю состав файлов директории. n = aDir(ad1,cDir+iif(Right(cDir,1)="\","*.*","\*.*"),"D") * Выявляю необработанные директории. for i = 1 to n if Trim(ad1[i,1])="." OR Trim(ad1[i,1])=".." loop endif if At("D",ad1[i,5]) < 1 loop endif c = cDir+iif(Right(cDir,1)="\","","\")+Upper(Trim(ad1[i,1])) j = ascan(aD,c) * Вносим найденную необработанную директорию в возвращаемый массив if j <= 0 nCount = nCount + 1 laDir[nCount] = c endif next * Возвращаем количество непустых подкаталогов. nL = 0 for i = 1 to _MAS if !Empty(laDir) nL = nl + 1 endif next retu #undef _MAS [/pre2]

Andrey: AndreyZh пишет: Может пригодится: Спасибо большое !

Andrey: AndreyZh пишет: но посмотрел, что в ней нет фоксовской экзотики Переделал на хХарбор. Смотреть и править тут: http://files.mail.ru/377KS7 Есть экзотика ! AndreyZh пишет: // Определяю состав файлов директории. n := ADir( ad1, cDir + IIf( Right( cDir, 1 ) = "\", "*.*", "\*.*" ), "D" ) На Харборе и Клипере функция aDir имеет другие параметры: ADir( [<cFileMask>], ; [<aName>] , ; [<aSize>] , ; [<aDate>] , ; [<aTime>] , ; [<aAttr>] ) --> nDirEnries Что за массив - ad1 ? Он нигде не объявлен !!!

AndreyZh: Andrey пишет: Что за массив - ad1 ? Он нигде не объявлен !!! Fox автоматически определяет массив при вызове данной функции... Аналог в clipper/harbout ad1 := directory(маска, ,atr) гемор в функашке связан, что в список файлов fox включает ".." "\" и т.д.

Петр: Andrey пишет: Переделал на хХарбор. Смотреть и править тут Смотреть нечего и править скорее всего придется вам. 1) Не переводите дословно. Это хорошо, что AndreyZh написал #define _MAS 64000 DIMENSION aArr(_MAS), aD(_MAS), laDir(_MAS) .. * обнуляю значения элементов массива. for i = 1 to _MAS aArr = "" aD = "" next а не так SET COMPATIBLE OFF aArr = "" aD = "" laDir = "" или так SET COMPATIBLE OFF STORE "" TO aArr, aD, laDir В данном случае используйте функции Clipper (AFILL) или операторы [x]Harbour (FOR EACH). 2) Помните о мультиплатформенности [x]Harbour cSour := Upper( AllTrim( cSour ) ) cTarg := Upper( AllTrim( cTarg ) ) источник возможных проблем для, например, Linux. То же самое можно сказать о "\", "*.*", "\*.*" Если вам нужен тупо веник, DirectoryRecurse() + shellAPI - самое то (спереть можно в МиниГУИ) 3) // Проверяю наличие каталога cTarg. Если каталога нет - создаю его. IF ! IsDirectory( cTarg ) nError := MakeDir( cTarg ) IF nError == 0 // ? "Directory", cTarg, "successfully created" ELSEIF nError == 5 // ? "Directory", cTarg, "exists already" ELSE Alert( "Error create for " + cTarg + " [" + LTrim( Str( nError ) ) + "]" ) RETURN NIL ENDIF ENDIF В MS Windows при таком алгоритме, мы можем получить "Directory exists already", даже если реально папка НЕ СУЩЕСТВУЕТ.

Andrey: Петр пишет: Если вам нужен тупо веник, DirectoryRecurse() + shellAPI - самое то (спереть можно в МиниГУИ) Спер ! Работает ТОЛЬКО с латиницей !!! Файлы с кирилицей просто ПРОПУСКАЕТ !!! Папки с кирилицей показывает. aDirFiles := DirectoryRecurse( cSource+"\"+cMaskaFileCopy, "DSH" ) Я использовал на пробу gtwin-терминал. REQUEST HB_CODEPAGE_RU866 HB_SetCodePage( "RU866" ) REQUEST HB_LANG_RU866 HB_LangSelect( "RU866" ) Что за фигня ??? Нужно наверно написать ТУДА (наверх) разработчикам, чтоб подправили !!!

Andrey: Петр пишет: В MS Windows при таком алгоритме, мы можем получить "Directory exists already", даже если реально папка НЕ СУЩЕСТВУЕТ. А почему ?

Петр: Andrey пишет: Спер ! Работает ТОЛЬКО с латиницей !!! Файлы с кирилицей просто ПРОПУСКАЕТ !!! Что вы сперли? DirectoryRecurse() есть в xHb, в МиниГУИ есть какой-никакой shellAPI. Andrey пишет: А почему ? А потому, что в папке-приемнике (которая у вас может и уже существовать и быть не пустой) может лежать уже файлик с именем, например, test, а вам нужно в ней же создать вложенную папку test. Вы попробуйте проделать это процедуру вручную, посмотрите на результат или запустите этот пример: [pre2]procedure main() local cDir := "test" local cFile := "test" local cpf, cps memowrit( cFile, "test" ) IF ! IsDirectory( cDir ) nError := MakeDir( cDir ) IF nError == 0 // ? "Directory", cDir, "successfully created" ELSEIF nError == 5 // ? "Directory", cDir, "exists already" ELSE Alert( "Error create for " + cDir + " [" + LTrim( Str( nError ) ) + "]" ) RETURN NIL ENDIF ENDIF cpf := cFile cps := cDir + "\" + cFile // Проверяю существование файла IF ! File( cps ) FileCopy( cpf, cps ) ENDIF [/pre2]

Andrey: Петр пишет: Что вы сперли? DirectoryRecurse() есть в xHb, в МиниГУИ есть какой-никакой shellAPI. Понял, что написал непонятно. Разъясняю. Работаю на хХарборе, терминал gtwin и gtwvt ! Делаю свою функцию копирования папок и файлов. Небольшой тестовый пример где не берутся ИМЕНА файлов на КИРИЛИЦЕ (может и на других языках): http://files.mail.ru/6OASZU Как видно из примера функция DirectoryRecurse() - не работает ПРАВИЛЬНО !!! Файлы с кирилицей просто ПРОПУСКАЕТ !!! Папки с кирилицей показывает. Нужно наверно писать в техподдержку, пускай исправляют. Сам я не осилю Кто нибудь напишите.... Пробовал http://clipper.borda.ru/?1-20-0-00000106-000-0-0-1128692936 - тоже не помогает ! Петр пишет: А потому, что в папке-приемнике (к ...... За разьяснение БОЛЬШОЕ СПАСИБО ! Я забыл про такие грабли ... В других прогах тоже присутствует это.... .

AndreyZh: ДобУтро! В своих "стонаниях" описывал "проблемы кирилицы", легко решаемые для: 1. Заголовков окон 2. Имена файлов и директорий и т.д. * ---------------------------------------------------------------------------------------- * Для xHarbour вынужден конвертировать. Clipper не меняю имени файла. FUNC zConv(c) RETU HB_OEMTOANSI(c)

AndreyZh: В догонку... Андрей, если любите заниматься переписыванием? На VFP адаптировал и поисправлял кучу ошибок и сейчас на VFP работает без проблем "генератор отчётов по RTF шаблонам" - если есть желание, то можете переписать и получить генератор для xHarbour... У меня пока руки не доходят за ненадобностью, т.к. использую его через своё VFP приложение.

Andrey: AndreyZh пишет: на VFP работает без проблем "генератор отчётов по RTF шаблонам" - если есть желание, то можете переписать и получить генератор для xHarbour. Тупиковая вещь ! Достаточно FastReport'a !!!| Вообще-то я задавал другой вопрос, если не знаете как исправить - то не пишите, не захламляйте текущую ветку !

Andrey: Сделал пример на хХарборе с помощью примера из МиниГуи ! (блин и когда работать будут функции хХарбора согласно документации) .... Рекурсию можно наверно задавать любую.... Похвалы не мне .... Столкнулся с другой проблемой ! НЕ МОГУ УДАЛИТЬ пустую папку !!! Выдает ошибку 32 !!! С чем это связано ??? Папка реально пустая. Сделал отдельный пример на основе своего - удаляет без ошибок ! А этот нет ! Помогите разобраться... Устал я за эти выходные.... Исходник и пример здесь http://files.mail.ru/WD4SWU

AndreyZh: Andrey пишет: Вообще-то я задавал другой вопрос, если не знаете как исправить - то не пишите, не захламляйте текущую ветку ! Да'с с вежливостью у Вас проблемы на все вопросы, в том числе по "аналогам" ответил выше (со зрением то же?)... Для других интересующихся данными вопросами вспомнил, что есть элементарное решение всех данных задач - WinAPI. Привожу код на Fox (просто в данной системе пришлось их решать), но обсуждались где-то аналогичные приёмы на Harbour: *** Глобальная переменная объекта доступа к методам класса файловой системы WINDOWS API PUBL goFSO *** Открываю или создаю объект файловой системы WinAPI * 1. Сохраняю старый обработчик ошибок Fox lcError = ON("ERROR") * 2. Запрет реагировать системе на ошибку отсутствия объекта ON ERROR goFSO = .NULL. * 3. Попытка получить ссылку на открытый объект (ЭТО НЕ НУЖНО - ПРОСТО КАК ПРИМЕР) goFSO = GetObject(,"Scripting.FileSystemObject") * 4. Если нет открытого объекта, то создаю его IF IsNull(goFSO) goFSO = CreateObject("Scripting.FileSystemObject") ENDIF * 5. Возврат старого обработчика ошибок ON ERROR &lcError -------------------------------- ПОТОМ ИСПОЛЬЗУЮ ПО МЕРЕ НЕОБХОДИМОСТИ, НАПРИМЕР ДЛЯ РАБОТЫ С КАТАЛОГАМИ * Копирую каталог со всеми подкаталогами goFSO.CopyFolder(стрИсходныйКаталог,стрКудаКопировать) * Удаляю исходный каталог. goFSO.DeleteFolder(стрУдаляемыйКаталог,.T.)

Andrey: AndreyZh пишет: Да'с с вежливостью у Вас проблемы на все вопросы, в том числе по "аналогам" ответил выше (со зрением то же?)... Мне нужно решить мою проблему на хХарборе. Ваши ответы не помогают решить эту проблему. Я пишу здесь о файлах, вы же предлагаете ваш какой-то генератор печати !!! Порассуждать можно в СПЕЦИАЛЬНОЙ ветке Для флейма. Заводите там свою тематику, порассуждаем там. AndreyZh пишет: Привожу код на Fox (просто в данной системе пришлось их решать) Еще раз пишу вам - здесь обсуждаются вопросы и решения на HARBOUR'e !!! Задаю вопрос конкретно - 32 ошибка удаления директории ? А какой ваш ответ ? Для Fox - заводите отдельную ветку и пишите там !

Dima: Andrey Полегче можно ? Остынь

Andrey: Dima Да блин не получается... второй день долблюсь , а тут про другое...

SADSTAR4: А почему не использовать системную команду MOVE? Сама все обойдет и скопирует и удалит. Если на разных дисках. А если на одном - просто перенесет ссылку в другой каталог (без копирования и удаления!)

Andrey: SADSTAR4 пишет: А почему не использовать системную команду MOVE? Да не хочется использовать запуск бат-файла. И добиться работы этой проги хочется. На простом месте - грабли ! Пример который я сделал, можно будет тогда использовать везде: на Харборе и хХарборе. Там вроде все просто и уровень вложенности любой можно копировать и удалять. Только вот удаление каталога почему-то не делается. Ошибка 32. Хотя я делал отдельный пример, он эти каталоги удаляет без проблем ! Одна и таже функция DIRMOVE() , одна и таже кодировка OEM - а не работает ??? Вот и взываю к гуру, почему так получается ? Уж очень дело до логического конца хочется довести.

Dima: Andrey пишет: Только вот удаление каталога почему-то не делается. Ошибка 32 Имя каталога набрано кирилицей ? Каталог пуст ? Есть ли в нем скрытые (системные) файлы ? Эта папка по сети никем не открыта ?

Chikanuk: Error Meaning 0 Successful 2 File not found 3 Path not found 4 Too many files open 5 Access denied 6 Invalid handle 8 Insufficient memory 15 Invalid drive specified 19 Attempted to write to a write-protected disk 21 Drive not ready 23 Data CRC error 29 Write fault 30 Read fault 32 Sharing violation 33 Lock Violation (x)Harbour.chm Похоже, удаляемая папка расшарена по сети?

Andrey: Dima пишет: Имя каталога набрано кирилицей ? Каталог пуст ? Есть ли в нем скрытые (системные) файлы ? Эта папка по сети никем не открыта ? Имя каталога набрано и кирилицей и латиницей. Каталог пуст, файлы в нем удаляются перед удалением папки. В них нет системных файлов. Папка локальная, т.е. у себя на компе, без сети. Chikanuk пишет: 32 Sharing violation Да читал я это - знаю. Я же писал вверху - подготовил рабочий пример (кода оченьмало). Выложил. Еще раз привожу ссылку. ( Исходник и пример здесьhttp://files.mail.ru/WD4SWU ) Попробуйте и сами увидите эту "чертовщину" .... Запуск: test_dir4.exe D:\TEST-DELETE Прога перенесет содержимое папки D:\TEST-DELETE (любой вложенности) в C:\@MUSOR Файлы удалит, а папки не сможет удалить !? Выдаст ошибку 32. Вот я вас и прошу указать мне где я не прав в исходнике, или кто тогда неправ ? хХарбор ? Как тогда удалить папки под хХарбором ? В принципе можно и забить (не удалять папки) - но не хочется сдаватся...

Chikanuk: Отработала на ура. Папку создал, накидал файлов, запустил и получил: Source - D:\TEST-DELETE\*.* 1, File: test_dir4.bc 2, File: test_dir4.exe 3, File: test_dir4.prg -------- Copy dir + files --------------- 1, File: D:\TEST-DELETE\test_dir4.bc --> C:\@MUSOR\test_dir4.bc 2, File: D:\TEST-DELETE\test_dir4.exe --> C:\@MUSOR\test_dir4.exe 3, File: D:\TEST-DELETE\test_dir4.prg --> C:\@MUSOR\test_dir4.prg -------- Delete files ---------------- 1, Delete file: D:\TEST-DELETE\test_dir4.bc (0) 2, Delete file: D:\TEST-DELETE\test_dir4.exe (0) 3, Delete file: D:\TEST-DELETE\test_dir4.prg (0) ---------- Delete DIR ---------------- 1, Delete DIR: [D:\TEST-DELETE] (0) Права на удаление папки у пользователя, под которым запускаешь тест, есть? Винда какая? (Тестил на Vista Home Premium)

Chikanuk: Andrey пишет: Вот я вас и прошу указать мне где я не прав в исходнике, Пример рекурсивного обхода директорий выбран неудачный: не выдает он ПУСТЫХ директорий (и всех вложенных ниже уровнем). А удалять пытаешься ПУСТЫЕ директории. Их и нет, соответственно, в массиве. Так что в твоем примере STATIC FUNCTION MyDirectoryRecurse( cPath, cFileMask, aResult ) не рабочая!!! Посмотри пример SAMPLES\ADVANCED\DirTree и в нем Static Procedure ScanDir( cPath ). Особенно на чекбокс Check_3. А отрабатывает твой пример только на 1-м уровне вложенности, т. е. папка и в ней файлы (что я и указал в предыдущем посте).

Andrey: Chikanuk пишет: Права на удаление папки у пользователя, под которым запускаешь тест, есть? Винда какая? (Тестил на Vista Home Premium) У меня WinXp SP3. Права админские. У меня получается другой результат: Source - D:\TEST-DELETE\*.* 1, File: test_dir4.bc 2, File: test_dir4.exe 3, File: test_dir4.prg 4, File: проба.txt 5, File: проба.тхт 6, File: установка.doc -------- Copy dir + files --------------- 1, File: D:\TEST-DELETE\test_dir4.bc --> C:\@MUSOR\test_dir4.bc 2, File: D:\TEST-DELETE\test_dir4.exe --> C:\@MUSOR\test_dir4.exe 3, File: D:\TEST-DELETE\test_dir4.prg --> C:\@MUSOR\test_dir4.prg 4, File: D:\TEST-DELETE\проба.txt --> C:\@MUSOR\проба.txt 5, File: D:\TEST-DELETE\проба.тхт --> C:\@MUSOR\проба.тхт 6, File: D:\TEST-DELETE\установка.doc --> C:\@MUSOR\установка.doc -------- Delete files ---------------- 1, Delete file: D:\TEST-DELETE\test_dir4.bc (0) 2, Delete file: D:\TEST-DELETE\test_dir4.exe (0) 3, Delete file: D:\TEST-DELETE\test_dir4.prg (0) 4, Delete file: D:\TEST-DELETE\проба.txt (0) 5, Delete file: D:\TEST-DELETE\проба.тхт (0) 6, Delete file: D:\TEST-DELETE\установка.doc (0) ---------- Delete DIR ---------------- 1, Delete DIR: [D:\TEST-DELETE] (32) Даже одну папку не может удалить ! Опять 32 ошибка. Интересно, почему XP и Vista по разному работают. Пойду тестить на других машинах....

Andrey: Chikanuk пишет: Посмотри пример SAMPLES\ADVANCED\DirTree и в нем Static Procedure ScanDir( cPath ). Особенно на чекбокс Check_3. Спасибо БОЛЬШОЕ за разъяснение и подсказки !!! Хоть куда-то двигаться дальше можно !!!

al-sklif: Andrey, подскажите, а чем кончились изыскания? А то у меня вылезла похожая проблема: 32 ошибка и все! Папка явно пустая и не расшарена...

Andrey: al-sklif пишет: Andrey, подскажите, а чем кончились изыскания? Да ничем. Бросил эту НЕПОНЯТКУ и все.... Видать вылазит эта ошибка при определенных условиях ! Тест мой здесь: http://files.mail.ru/8VY0WD Может дело только в хХарборе ? Попробуй собрать на Харборе.

nick_mi: Андрей! в твоем примере на Harbour - те-же результаты. Но если заремить MyCopyDir и оставить только MyDeleteDir( cSource, "*.*" ) - удаления директория проходят, по крайней мере для первого уровня, глубже рекурсию я не делал. Очевидно где-то в MyCopyDir оставляешь какие-то хвосты, которые не позволяют удалить директорий.

Andrey: nick_mi пишет: MyCopyDir оставляешь какие-то хвосты, которые не позволяют удалить директорий. Вот и я об этом тоже писал ! Нет файлов - одни хвосты... Что-то в Харборе не закрывается (флаг какой-нибудь), т.е. Харбор понимает, что директория занята после копирования файлов ! Это тогда разработчикам на форум писать надо. Я не знаю как ! Короче НЕПОНЯТКИ по Харбору тоже.

nick_mi: Замени FileCopy на команду copy file f1 to F2 и в Harbour - Счастье !!! отработало

Andrey: nick_mi пишет: Замени FileCopy на команду copy file f1 to F2 И всех делов то.... Т.е. функция в Харборе - FileCopy() глючная ?

al-sklif: Разгреб я все-таки свой ЧАСТНЫЙ случай: В папке лежат файлы текстового формата, их надо обработать, перенести в разные места, в зависимости от содержимого и пустую папку удалить. Так вот проблема лезла после применения функции filesize() к файлу в этой папке. После этого прога считала, что папка расшарена и все, несмотря на то, что все файлы потом удалялись. Проблему решил путем последующего применения filesize() любому, от фонаря, можно и к явно не существующему файлу, типа filesize("C:\123.txt")... После этого все пошло как надо

nick_mi: Для программы Андрея этот метод тоже отработал

Andrey: al-sklif пишет: После этого все пошло как надо ! nick_mi пишет: Для программы Андрея этот метод тоже отработал Спасибо БОЛЬШОЕ вам !!! Не люблю оставлять недоделанные проги....

Andrey: Ни фига, не работает - во так: MyCopyDir( cSource, "C:\@Musor", "*.*" ) FileSize("C:\123.txt") MyDeleteDir( cSource, "*.*" ) При удалении ПАПКИ выдает опять 32 ошибку !

al-sklif: Андрей, поэтому то я и писал о частном случае. Т.е., судя по всему, у меня глючит функция filesize(), именно в Харборе, которую я применял в проге. Т.е. она хватала папку и не отпускала... Но я ее применял... Когда nick_mi написал о том, что это сработало и в твоем примере, я малость удивился, т.к. ее не обнаружил в тексте примера. Вот. Поэтому не знаю почему там все заработало! Но... Возможно, что и там аналогичный глюк у какой-то схожей по применению функции. Еще. Я удаляю каталог не лежащий в основной директории, а фактически подкаталог третьего уровня, а FileSize("C:\123.txt") цепляет файл в основной папке. Может еще что-то здесь? Не знаю. Если nick_mi выложит свой пример, то поймем в чем дело

nick_mi: У меня нет своего примера. Я взял программу Андрея и добавил вызов Filesize(). Но делал я это в HARBOUR только сто проверил на вложенных - глубина 2, тоже отработала Вот кусок кода MyCopyDir( cSource, "C:\@Musor", "*.*" ) filesize ("C:\123.txt") MyDeleteDir( cSource, "*.*" )

Andrey: nick_mi пишет: Но делал я это в HARBOUR, только сто проверил на вложенных - глубина 2, тоже отработала Значит в хХарборе не работает. Печально... А как отправить эту ошибку разработчикам хХарбора ? Может кто нибудь сообщит им об этом, а то у меня с английским плохо...

santy: Андрей, взял ваш пример, ничего не менял. Создал проэкт в xHarbour v.9437 Bcc 551, при компиляции добавил библиотеку ct.lib. Глубина каталогов - 4 , Копирует без ошибок и удаляет все файлы и каталоги без ошибок.

Andrey: santy Спасибо БОЛЬШОЕ ! А какая система, где пример выполнялся ? И комп сетевой или без сети ? И там в проекте еще был готовый пример, он работает ? У меня не работает на WinXP SP3 + сеть.

santy: Ваш готовый пример не работает. У меня стоит Win XP SP3, без сети. Попробую в сети протестировать.

Andrey: Windows 7 Домашняя Расширенная x64 + сеть xHarbour build 1.2.1 Intl. (SimpLex) (Rev. 6406) Borland C++ 5.5.1 (32 bit) 4, Delete DIR: [D:\TEMP2\dir0000.chk] (0) 3, Delete DIR: [D:\TEMP2\TEMP\TEMP] (0) 2, Delete DIR: [D:\TEMP2\TEMP] (145) 1, Delete DIR: [D:\TEMP2] (145) На СЕМЕРКЕ появилась уже другая ошибка - 145 ! Прикол....

Andrey: Что-то не могу собрать пример для Харбора 3.1 Выдает что нет функции: Error: Unresolved external '_HB_FUN_ISDIRECTORY' referenced from Z:\HB30\.HBMK\WIN\BCC\TEST_DIR5.OBJ hbmk2: Error: Running linker. 2 Хотя в примерах есть это использование функции: Z:\hb30\contrib\hbgd\tests\ Z:\hb30\examples\httpsrv\modules\ Да и в самой библе есть такая: Z:\hb30\lib\win\bcc\ harbour-30-bcc.lib hbrtl.lib xhb.lib Что нужно подправить в test_dir5.hbp ? # # $Id$ # -3rd=hbide_version=1.0 -3rd=hbide_title=Dir-demo -3rd=hbide_output=demo -3rd=hbide_xhb=YES # -inc -mt -gtwin test_dir5.prg Сам пример тут : http://files.mail.ru/UGRQUY

AlexMyr: Andrey пишет: Error: Unresolved external '_HB_FUN_ISDIRECTORY' referenced from Z:\HB30\.HBMK\WIN\BCC\TEST_DIR5.OBJ эта ф-я находится в библиотеке xhb, используй hb_DirExists()!

Andrey: AlexMyr пишет: эта ф-я находится в библиотеке xhb, используй hb_DirExists()! Спасибо ! Я по ChangeLog прочитал, понял потом. А как все таки добавить xhb в test_dir5.hbp ?

AlexMyr: -lxhb

Andrey: Короче, совсем завал... Скомпилировал пример на Harbour 3.0.0 (Rev. 16951). Программа запускается, но ничего не делает ! Полный обвал... Подскажите чем различается Харбор и хХарбор в моем случае ? Пример здесь http://files.mail.ru/LYIEYI

santy: Посмотрите проект: http://files.mail.ru/0ZJINQ ошибка 145 у меня также была, но после перекомпиляции уже не было.

AlexMyr: нормально отработало ¦ Копирование папок с файлами произвольной структуры на другой диск/папку. ¦ Удаление папок с файлами произвольной структуры. Copyright (c) 2011-2012, Verchenko Andrey, Dmitrov, E-mail: 30195@mail.ru GTWVT-terminal, CODEPAGE RU866 Windows XP 5.1.2600 Service Pack 3 Harbour 3.0.0 (Rev. 16951) Borland C++ 5.5.1 (32-bit) --> Copy dir + files : Test_dir55-Copy-Delete.rar --> Delete DIR : 12

Andrey: santy пишет: Посмотрите проект: Посмотрел... и офигел... xhb_copy_file.exe у меня нечего не делает.... Запускается и вылетает, якобы ничего нет, но не на всех папках. Папка для пробы здесь http://files.mail.ru/QJS1VX А что за файл - xhb_copy_file.xpj ? Каким редактором пользуешься ?

Andrey: santy пишет: нормально отработало А проект сразу собрался ? Или правил мой test_dir55.hbp ? У меня запускается и вылетает, якобы ничего нет, но не на всех папках. Папка для пробы здесь http://files.mail.ru/QJS1VX

nick_mi: И у меня EXE-программа из примера правильно отработала

AlexMyr: Andrey пишет: А проект сразу собрался ? Или правил мой test_dir55.hbp ? запускал сначала твой exe, потом собирал ничего не меняя в hbp, все нормально. А вот с папкой для пробы не работатет!

Andrey: AlexMyr пишет: запускал сначала твой exe, потом собирал ничего не меняя в hbp, все нормально. Значит я прогу правильно собрал, а то уж тупить начал... Ура, получилось собирать на Harbour'e !!! AlexMyr пишет: А вот с папкой для пробы не работатет! Да видать не все работает ... Значит не я туплю ! Интересно, а что там в папочке такого, что Харбор ломается ?

AlexMyr: // Определяю список подкаталогов и файлов корневого каталога aDirFiles := MyDirectoryRecurse( cSource, cMaskaFileCopy, { } ) возвращает пустой масив, нужно ковырять MyDirectoryRecurse, что-то не так!

AlexMyr: похоже ф-я не правильно обрабатывает файлы без расширений, вот, если все файлы с расширениями, то все нормально!

Andrey: Резуме: Пример ПРАВИЛЬНО работает на Harbour 3.x и xHarbour v.9437 Bcc 551, при условии что файлы в папке удаления ТОЛЬКО с расширениями ! В остальных компиляторах не работает пример. Ура победили совместными усилиями !!! Всем БОЛЬШОЕ СПАСИБО за помощь ! AlexMyr пишет: нужно ковырять MyDirectoryRecurse, Брал из МиниГуи - пример SAMPLES\BASIC\DirectoryRecurse Проверил пример - ничего не показывает ! Тогда наверно с этой ошибкой к Филатову ! Или самим исправить можно ?

santy: Andrey пишет: А что за файл - xhb_copy_file.xpj ? Каким редактором пользуешься ? Я использую xEdit от Xailer http://www.xailer.com/.

AlexMyr: Написал с нуля перенос папок, пробуй. Будут вопросы - задавай [pre2] #include "directry.ch" STATIC cPathG := "" FUNC main( cSource ) LOCAL ad1 := {} IF cSource == Nil Alert( "Put the source path" ) ELSE IF hb_DirExists( cSource ) scan_dir( cSource, "*.*", @ad1, .F. ) IF MyMove( "c:\BackUp1", ad1 ) == 0 scan_dir( cSource, "*.*", ad1, .T. ) ENDIF ELSE Alert( cSource + " don't exist" ) ENDIF ENDIF RETURN nil FUNC scan_dir( cPath, cFMask, arr, lDele ) LOCAL x := 0, nResDel LOCAL aDir LOCAL cSavePath := cPathG cPathG += cPath + "\" aDir := Directory( AllTrim( cPathG ) + AllTrim( cFMask ), "D" ) AAdd( arr, { cPathG, aDir } ) FOR x := 1 TO Len( aDir ) IF aDir[x,F_ATTR] == "D" .AND. ! AllTrim( aDir[x,F_NAME] ) $ ". .." scan_dir( aDir[x,F_NAME], "*.*", @arr, lDele ) ELSEIF aDir[x,F_ATTR] != "D" .AND. lDele OutStd( hb_eol() ) OutStd( "DELETE FILE " + cPathG + aDir[x,F_NAME] ) FErase( cPathG + aDir[x,F_NAME] ) nResDel := FError() OutStd( " ..." + iif( nResDel == 0," OK",Str(nResDel ) ) ) ENDIF NEXT IF lDele OutStd( hb_eol() ) OutStd( "DELETE DIR " + cPathG ) hb_DirDelete( cPathG ) nResDel := FError() OutStd( " ..." + iif( nResDel == 0," OK",Str(nResDel ) ) ) ENDIF cPathG := cSavePath RETURN nil PROC MyMove( cTarget, arr ) LOCAL x, y, nRes IF ! hb_DirExists( cTarget ) hb_DirCreate( cTarget ) ENDIF for EACH x in arr hb_DirCreate( cTarget + "\" + x[1] ) IF ValType( x[2] ) == "A" .AND. ! Empty( x[2] ) for EACH y in x[2] IF ! y[1] $ ". .." OutStd( hb_eol() ) OutStd( "COPY FILE " + x[1] + y[1] + " TO " + ctarget + "\" + x[1] + y[1] ) __CopyFile( ( x[1] + y[1] ), ( ctarget + "\" + x[1] + y[1] ) ) nres := FError() OutStd( " ..." + iif( nRes == 0," OK",Str(nRes ) ) ) ENDIF next ENDIF next RETURN nRes [/pre2]

Andrey: AlexMyr пишет: Написал с нуля перенос папок, пробуй. Ну молодец ! Буду пробовать...

AlexMyr: Немного подправил и добавил. Теперь на входе два параметра 1-й исходная папка, 2-й опция -move, если указана - делаем перенос, если нет - просто копируем. Папку можно задавать и с указанием полного пути к ней! Копирование с выводом лога в файл aa.log prog1 PRIKOL >aa.log то же, но с указанием полного пути prog1 c:\path1\PRIKOL >aa.log Перенос с выводом лога в файл aa.log prog1 PRIKOL -move >aa.log то же, но с указанием полного пути prog1 c:\path1\PRIKOL -move >aa.log [pre2]#include "directry.ch" #include "hbextcdp.ch" STATIC cPathG := "" FUNC main( cSource, lMove ) LOCAL ad1 := {} LOCAL cHostCP := "UA1251" LOCAL cTermCP := "UA1251" LOCAL lBoxChar := .T. hb_cdpSelect( cHostCP ) hb_SetTermCP( cTermCP, cHostCP, lBoxChar ) IF cSource == Nil Alert( "Put the source path" ) ELSE IF hb_DirExists( cSource ) scan_dir( cSource, "*.*", @ad1, .F. ) IF MyMove( "c:\BackUp1", ad1 ) == 0 IF lMove != NIL .AND. Lower( AllTrim( lMove ) ) == "-move" scan_dir( cSource, "*.*", ad1, .T. ) ENDIF ENDIF ELSE Alert( cSource + " don't exist" ) ENDIF ENDIF RETURN nil FUNC scan_dir( cPath, cFMask, arr, lDele ) LOCAL x := 0, nResDel LOCAL aDir LOCAL cSavePath := cPathG cPathG += cPath + "\" aDir := Directory( AllTrim( cPathG ) + AllTrim( cFMask ), "D" ) AAdd( arr, { cPathG, aDir } ) FOR EACH x in aDir IF x[F_ATTR] == "D" .AND. ! AllTrim( x[F_NAME] ) $ ". .." scan_dir( x[F_NAME], "*.*", @arr, lDele ) ELSEIF x[F_ATTR] != "D" .AND. lDele OutStd( hb_eol() ) OutStd( "DELETE FILE " + cPathG + x[F_NAME] ) FErase( cPathG + x[F_NAME] ) nResDel := FError() OutStd( " ..." + iif( nResDel == 0," OK",Str(nResDel ) ) ) ENDIF NEXT IF lDele OutStd( hb_eol() ) OutStd( "DELETE DIR " + cPathG ) hb_DirDelete( cPathG ) nResDel := FError() OutStd( " ..." + iif( nResDel == 0," OK",Str(nResDel ) ) ) ENDIF cPathG := cSavePath RETURN nil PROC MyMove( cTarget, arr ) LOCAL x, y, nRes, cPathwoDisk := "", cDirItem, cPathLong := "" IF ! hb_DirExists( cTarget ) hb_DirCreate( cTarget ) ENDIF for EACH x in arr IF ":" $ x[1] cPathwoDisk := SubStr( x[1], hb_At( ":\",x[1] ) + 2 ) ELSE cPathwoDisk := x[1] ENDIF cPathLong := cTarget FOR EACH cDirItem IN hb_ATokens( cPathwoDisk, hb_ps() ) IF !Empty( cDirItem ) cPathLong += hb_ps() + cDirItem if ! hb_DirExists(cPathLong) hb_DirCreate( cPathLong ) endif ENDIF next IF ValType( x[2] ) == "A" .AND. ! Empty( x[2] ) for EACH y in x[2] IF ! y[1] $ ". .." OutStd( hb_eol() ) OutStd( "COPY FILE " + x[1] + y[1] + " TO " + ctarget + "\" + cPathwoDisk + y[1] ) __CopyFile( ( x[1] + y[1] ), ( ctarget + "\" + cPathwoDisk + y[1] ) ) nres := FError() OutStd( " ..." + iif( nRes == 0," OK",Str(nRes ) ) ) ENDIF next ENDIF next RETURN nRes[/pre2]

Andrey: AlexMyr пишет: Немного подправил и добавил. Спасибо большое за пример ! Попробую его на хХарбор переделать... Я пока на нем сижу. Дай пожалуйста свой е-майл, хочу прогу выслать... Или мне на почту напиши 30195 СОБАКА mail.ru

AlexMyr: e-mail в профиле указан. А что за прога?



полная версия страницы