Форум » [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



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