Russian Qt Forum

Qt => Общие вопросы => Тема начата: br3d от Июнь 14, 2009, 01:26



Название: метод копирования папки
Отправлено: br3d от Июнь 14, 2009, 01:26
подскажите, есть ли в какомнибудь из встроенных классов qt метод копирования папки ???

или как то придется ухищряться через  QFile::copy ( const QString & newName )????


Название: Re: метод копирования папки
Отправлено: ритт от Июнь 14, 2009, 03:06
вот оно! а я уж ожидал, что никого эта таска не интересует...
как раз в понедельник собирался ругать троллей :)

суть в том, что копирование папки реализовано только для венды и только лишь одним способом (и то, не слишком логичным) - QFile("c:/dirpath").copy("d:/newdirpath")). согласитесь, куфайл, принимающий на вход путь к папке - нелепица...но с этим пока что ничего не поделаешь.

советую не рассчитывать на исправление ситуации до выхода 4.6. поэтому QDirIterator + QFile::copy в зубы - и вперёд.

зы. просяню ситуацию - отпишусь в данной ветке.


Название: Re: метод копирования папки
Отправлено: spectre71 от Июнь 14, 2009, 06:15
суть в том, что копирование папки реализовано только для венды и только лишь одним способом (и то, не слишком логичным) - QFile("c:/dirpath").copy("d:/newdirpath")). согласитесь, куфайл, принимающий на вход путь к папке - нелепица...но с этим пока что ничего не поделаешь.

А откуда информация что для винды QFile("c:/dirpath").copy("d:/newdirpath")) - работает?
И когда тролли обещают 4.6 версию?


Название: Re: метод копирования папки
Отправлено: ритт от Июнь 14, 2009, 06:31
суть в том, что копирование папки реализовано только для венды и только лишь одним способом (и то, не слишком логичным) - QFile("c:/dirpath").copy("d:/newdirpath")). согласитесь, куфайл, принимающий на вход путь к папке - нелепица...но с этим пока что ничего не поделаешь.

А откуда информация что для винды QFile("c:/dirpath").copy("d:/newdirpath")) - работает?
И когда тролли обещают 4.6 версию?

судя по коду, должно работать.
официальных сроков ещё нет, вроде бы...


Название: Re: метод копирования папки
Отправлено: Пантер от Июнь 14, 2009, 10:37
Можно пока через апи сделать.


Название: Re: метод копирования папки
Отправлено: ритт от Июнь 14, 2009, 10:40
через какое апи?


Название: Re: метод копирования папки
Отправлено: br3d от Июнь 14, 2009, 11:03
хех, в том и проблемма, что для линукса надо ((( :-[


Название: Re: метод копирования папки
Отправлено: Rcus от Июнь 14, 2009, 11:12
Для Unix образных придется привязываться к какой-нибудь библиотеке, например KIO (http://api.kde.org/4.2-api/kdelibs-apidocs/kio/html/namespaceKIO.html#fc72bd38f53ade4d3a28dfeef35f4065)


Название: Re: метод копирования папки
Отправлено: Пантер от Июнь 14, 2009, 11:12
В винде через винапи.
В Линухе через вызов QProcess->start("/bin/sh cp -r ..........")


Название: Re: метод копирования папки
Отправлено: ритт от Июнь 14, 2009, 11:23
жестоко. а QDirIterator + QFile::copy не канает?


Название: Re: метод копирования папки
Отправлено: Rcus от Июнь 14, 2009, 11:28
Конечно жестоко вопроизводить закат солнца вручную :) Ладно, умолкаю, ибо понимаю что любое упоминание kdelibs здесь можно воспринимать как толстый троллинг пуристов.


Название: Re: метод копирования папки
Отправлено: Пантер от Июнь 14, 2009, 11:34
жестоко. а QDirIterator + QFile::copy не канает?
Это лучший вариант. Но если автору не хочется заморачиваться и писать свою функцию копирования, то мой вариант будет проще.


Название: Re: метод копирования папки
Отправлено: ритт от Июнь 14, 2009, 12:10
жестоко.
это я про QProcess.


Название: Re: метод копирования папки
Отправлено: br3d от Июнь 14, 2009, 19:58
Всем спасибо !!!!
      буду копаться с итерацией,  не выйтет тогда аоспользуюст идеей на счет QProcess


Название: Re: метод копирования папки
Отправлено: spectre71 от Июнь 14, 2009, 22:04
Не понимаю в чем проблема.
Ну, нет рекурсивного копирования директории, но есть возможность обхода начиная с заданного пути(даже без всяких встроенных итераторов), создания папок и копирования файлов. Проблема должна решиться написанием 20-50 сторчек кода.

Или я в чем-то не прав?


Название: Re: метод копирования папки
Отправлено: Rcus от Июнь 14, 2009, 22:39
Не понимаю в чем проблема.
Ну, нет рекурсивного копирования директории, но есть возможность обхода начиная с заданного пути(даже без всяких встроенных итераторов), создания папок и копирования файлов. Проблема должна решиться написанием 20-50 сторчек кода.

Или я в чем-то не прав?

Это мягко говоря оптимистичный прогноз, во время копирования может произойти все что угодно, начиная от прав, заканчивая отсутствием inode'ов (да, именно поэтому у меня на EeePC не собрались kdelibs - не хватило 240к файлов). А ведь как обычно захочется асинхронности, отображения прогресса и прочего... Удачи уложиться в KLoC.


Название: Re: метод копирования папки
Отправлено: spectre71 от Июнь 15, 2009, 06:42
Это мягко говоря оптимистичный прогноз, во время копирования может произойти все что угодно, начиная от прав, заканчивая отсутствием inode'ов (да, именно поэтому у меня на EeePC не собрались kdelibs - не хватило 240к файлов). А ведь как обычно захочется асинхронности, отображения прогресса и прочего... Удачи уложиться в KLoC.
Ты абсолютно прав. Но как говориться - не все сразу.
Основную обработку ошибок сделать не трудно, а все остальное либо делать позже, либо ждать от троллей.


Название: Re: метод копирования папки
Отправлено: ритт от Июнь 15, 2009, 07:52
воот, я про это же.

зы. у троллей при копировании папки об ошибках не уведомляется, вроде...


Название: Re: метод копирования папки
Отправлено: br3d от Июнь 16, 2009, 20:04
долго маялся, с  QDirIterator ...
   получилось как то так что он из всех вложенных подпапок копирует в одну целевую...,

Вообщем в результате, реализовал так:

        QProcess prc;
        QStringList pars;
        pars<<"-r";
        pars<< path;
        pars<< path2;
        prc.start("cp",pars);
        prc.waitForFinished(); //от без этой функции, выполнение программы
                                       //прерывалось до её завершения и копировалось не все(((


Название: Re: метод копирования папки
Отправлено: spectre71 от Июнь 16, 2009, 21:25
Ну-Ну.
И как ты это будешь контролировать?
Например, если какой-то файл не сможет скопироваться по тем или иным причинам, как ты это отследишь?


Название: Re: метод копирования папки
Отправлено: Пантер от Июнь 17, 2009, 06:19
Можно будет ловить код завершения процессса.


Название: Re: метод копирования папки
Отправлено: spectre71 от Июнь 17, 2009, 09:30
Можно будет ловить код завершения процессса.

Слишком мало информации.
Проще самому организовать рекурсивное копирование.

Кстати "cp" под виндой нет.


Название: Re: метод копирования папки
Отправлено: spirit от Июнь 17, 2009, 09:37
Можно будет ловить код завершения процессса.

Слишком мало информации.
Проще самому организовать рекурсивное копирование.
полностью согласен, это и будет нормальным кросс-платформенным решением.


Название: Re: метод копирования папки
Отправлено: Пантер от Июнь 17, 2009, 11:30
Можно будет ловить код завершения процессса.

Слишком мало информации.
Проще самому организовать рекурсивное копирование.

Кстати "cp" под виндой нет.

Да ладно. А как же copy и xcopy?


Название: Re: метод копирования папки
Отправлено: ритт от Июнь 17, 2009, 11:43
ха. а отписаться забыл :)
если коротко, то все об этом знают, помарочка-напоминалочка в коде стОит, но никому пока дела до данной задачи нет (кстати, такой таски в паблике трекера тоже нет - можно смело рапортовать).
судя по манпагам, подобного функционала в апи никсов также нет - единственная альтернатива - рекурсивный QDirIterator + код QFile::copy.
и даже больше - если, не дай божа, вы написали свою реализацию файлэнджины для не-локальных накопителей (попросту говоря, вфс), текущая реализация не позволит скопировать папку с физической фс на виртуальную (и наоборот) - и всё-равно придётся грызть QDirIterator + код QFile::copy.

если кому интересно, я намерен к 4.6 данное безобразие искоренить (если меня в конце-концов не забанят на гиториусе :) )


Название: Re: метод копирования папки
Отправлено: spirit от Июнь 17, 2009, 11:44
если кому интересно, я намерен к 4.6 данное безобразие искоренить (если меня в конце-концов не забанят на гиториусе :) )
ага, было бы очень неплохо.


Название: Re: метод копирования папки
Отправлено: spectre71 от Июнь 17, 2009, 11:47
Да ладно. А как же copy и xcopy?
1) платформозависимо
2) надо отключать всякие подтверждения ...
3) Опять же обработка ошибок, проще сделать самому рекурсивное копиривание и добавлять различные обработки
ошибок, откаты итд, по мере развития кода и необходимости. Простой вариант можно написать и отладить за пару часов.


Название: Re: метод копирования папки
Отправлено: Пантер от Июнь 17, 2009, 11:50
spectre71: я не говорил что этот вариант лучше. Просто если есть трудности самонаписания рекурсивного копирования, а сроки поджимают, можно использовать данный вариант, который потом можно будет заменить на верный.


Название: Re: метод копирования папки
Отправлено: spectre71 от Июнь 17, 2009, 11:50
если кому интересно, я намерен к 4.6 данное безобразие искоренить (если меня в конце-концов не забанят на гиториусе :) )

Это очень многим надо, в смысле искоренить безобразие :)


Название: Re: метод копирования папки
Отправлено: mugabe от Июнь 17, 2009, 12:50
...который потом можно будет заменить на верный.
в таких ситуациях обычно "потом" наступает только когда приходит другой разработчик и о***вает от увиденного :))