Russian Qt Forum

Qt => Общие вопросы => Тема начата: Radamas от Март 13, 2008, 13:33



Название: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: Radamas от Март 13, 2008, 13:33
пытаюсь скопировать все файлы из одного директория в другой с помощью QProcess и команды cp, но ничего не происходит, только изменяется дата изменения файлов! Директории все созданы и из терминала команда работает на все 100, а при помощи QProcess похоже копирует файлы в то же место где они и лежали! Помогите! версия Qt 3.3.3:

что делаю:

QProcess proc;
proc.addArgument("cp");
proc.addArgument("-f");
proc.addArgument("/Maps/Temp/*.*");
proc.addArgument("/Maps/Temp/1");
bool result = proc.start() //возвращает 1
while(proc.isRunning())
{
}

В чем проблема не пойму! Может есть другие простые методы копирования файлов?


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: Steven_Orko от Март 13, 2008, 14:18
Проблемма в том, что не дочитал мануал по башу либо по cp. Ты не указал, какие файлы копировать.
А файла со звездочками не существует. Это баш вместо звездочек поставляет по маске, что найдет.
Так что тебе надо явно указать, какие файлы копировать.


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: Radamas от Март 13, 2008, 16:53
Проблемма в том, что не дочитал мануал по башу либо по cp. Ты не указал, какие файлы копировать.
А файла со звездочками не существует. Это баш вместо звездочек поставляет по маске, что найдет.
Так что тебе надо явно указать, какие файлы копировать.

Спасибо большое:) я не догадался что в QProcess нельзя использовать *.*


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: BigHom от Март 26, 2010, 15:23
Как записать результат выполния командной строки - в файл с помощью QProcess?


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: niXman от Март 26, 2010, 15:29
Цитировать
cp file1.ext file2.ext > log.txt


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: BigHom от Март 26, 2010, 15:38
Нет , скажем sl >a.a на QT -кажись должно :

QProcess proc;
proc.addArgument("sl");
proc.addArgument(">a.a");
bool result = proc.start() //возвращает 1
while(proc.isRunning())
{
}
  но почему-то ничего не записывает...в файл a.a


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: crossly от Март 26, 2010, 15:46
а может стоит попробовать QFile....


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: niXman от Март 26, 2010, 15:49
Нет , скажем sl >a.a на QT -кажись должно :

QProcess proc;
proc.addArgument("sl");
proc.addArgument(">a.a");
bool result = proc.start() //возвращает 1
while(proc.isRunning())
{
}
  но почему-то ничего не записывает...в файл a.a
вы о чем? и кто такой sl ?


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: BigHom от Март 26, 2010, 16:05
"Команда ls сначала выводит список всех файлов (не каталогов), перечисленных в командной строке, а затем выводит список всех файлов, находящихся в каталогах, перечисленных в командной строке. " Мне нужно подсчитать контрольную сумму cd - диска и записать в файл. С помощью командной строки можно найти как это сделать  -  вопрос как записать в файл, чтоб потом в программе использовать? Для примера взял команду sl.


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: BigHom от Март 26, 2010, 16:28
Перепутал , команда "ls" -  Я так думаю что подсчёт контрольной суммы : ls /mnt/cdrom -a |md5sum >a.a
Только почему-то ничего не записывает в файл . Поэтому упростил до: ls >a.a но всё равно с помощью QProcess ничего не записалось в файл...


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: crossly от Март 26, 2010, 16:31
пайпы и команды перенаправления ввода-вывода с QProcess не работают...
используй
Код:
void QProcess::readyReadStdout () [signal]
и пиши потом это куда тебе надо...


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: BigHom от Март 29, 2010, 09:11
Не совсем понял как писать , откуда считывать? Можно пример?


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: crossly от Март 29, 2010, 12:28
это сигнал.... его испускает QProccess при проявлении данных в нем.... напиши слот.... соедини его сигналом.... и в нем читай данные..


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: BigHom от Март 29, 2010, 15:00
Сигнал посылаю - данные давай , а нас посылают обратно...


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: BigHom от Март 29, 2010, 16:28
Пишу с помощью файла .ui.h , поэтому если бы сигнал был бы от кнопки или ещё чего-нибудь , то подсоединил бы... а тут сигнал от QProcess  поискал в примерах , там дано в таком виде:
   QProcess proc7;
...
   proc7.addArgument("ls");
   proc7.addArgument(">a.a");
   connect( proc7, SIGNAL(proc7.readyReadStdout()),
           this,   SLOT(readFromStdout())      );

void MyDialog2::readFromStdout()
{
//    textEdit->append( proc7->readStdout() );
}

При компиляции выдаёт ошибку:


c:\Qt\myd290310\MyDialog2.ui.h(1149): error C2664: 'bool QObject::connect(const QObject *,const char *,const QObject *,const char *)' : cannot convert parameter 1 from 'QProcess' to 'const QObject *'
        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: crossly от Март 29, 2010, 16:50
это потому что connect требует от тебя указатель в качестве аргумента....


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: MoPDoBoPoT от Март 29, 2010, 16:56
Пишу с помощью файла .ui.h , поэтому если бы сигнал был бы от кнопки или ещё чего-нибудь , то подсоединил бы...
Наверное ты имел ввиду QtDesigner. Кстати, для новичков лучше обходится без него.

connect( proc7, SIGNAL(proc7.readyReadStdout()),
           this,   SLOT(readFromStdout())      );
В метод QObject::connect() надо передавать указатели, а QProcess создан на стеке, что, кстати, является ошибкой, так как при выходе из функции (скорей всего из конструктора) объект разрушится и никаких сигналов ты не получишь.
Создавай QProcess в куче: QProcess *proc7 = new QProcess(this);


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: BigHom от Март 29, 2010, 18:07
[Создавай QProcess в куче: QProcess *proc7 = new QProcess(this);
Тогда ошибки здесь :
   proc7.addArgument("ls");
   proc7.addArgument(">a.a");


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: MoPDoBoPoT от Март 29, 2010, 18:18
[Создавай QProcess в куче: QProcess *proc7 = new QProcess(this);
Тогда ошибки здесь :
   proc7.addArgument("ls");
   proc7.addArgument(">a.a");
Само собой :) У тебя же указатель... (С++ знаешь?)
proc7->addArgument("ls");

Насчет моего предыдущего поста: надо же хранить указатель на QProcess в виде члена класса (доступ к объекту нужен и в других методах), поэтому надо так:
proc7 = new QProcess(this);
А в описании класса добавить QProcess *proc7;


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: crossly от Март 29, 2010, 18:25
а может стоит начать с изучения c++ ??


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: BigHom от Март 29, 2010, 18:54
Само собой :) У тебя же указатель... (С++ знаешь?)
proc7->addArgument("ls");

Насчет моего предыдущего поста: надо же хранить указатель на QProcess в виде члена класса (доступ к объекту нужен и в других методах), поэтому надо так:
proc7 = new QProcess(this);
А в описании класса добавить QProcess *proc7;
Раньше на Делфи писал , там всё логично - последовательно выполняется ,  вместо рассказа о том как всё работаёт - конкретно оператор - в с++ видно наоборот сначала рассказ где что подёргать вместо операторов . Конечно , стрёлка нужна всё оттранслировалось , но без "proc7 = new QProcess(this);" - пока не понял для чего это , поэтому при выполнении пишет "программа завершилась с ошибкой" . Все языки одинаковые  - всё изучается на практике :-)


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: Alex Custov от Март 29, 2010, 19:28
Перепутал , команда "ls" -  Я так думаю что подсчёт контрольной суммы : ls /mnt/cdrom -a |md5sum >a.a

MD5 сумма считается с образа, а не со списка файлов! Нужно читать устройство CDROM-a (/dev/cdrom, /dev/hda - в зависимости от системы).


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: Alex Custov от Март 29, 2010, 20:11
Все языки одинаковые  - всё изучается на практике :-)

Все языки должны изучаться на профессиональной документации, попутно занимаясь практикой. Иначе результаты как правило плачевны  ::)


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: niXman от Март 29, 2010, 20:26
дополню: для некоторых разделов, потребуются права супер-юзера.

а читать раздел, как-то так:
Код
C++ (Qt)
int main(int argc, char** argv) {
  const size_t size = 32768;
  std::ifstream file("/dev/cdrom");
  if ( !file ) {
     std::cerr << strerror(errno) << std::endl;
     return 1;
  }
 
  boost::array<char, size> buff;
 
  while ( file.good() ) {
     size_t rd = file.read(buff.data(), buff.size()).gcount();
  }
 
  return 0;
}
 
 


Название: Re: Копирование файлов с помошью QProcess и cp! Проблем&#
Отправлено: BigHom от Март 30, 2010, 14:41
выводит только содержимое cd-диска:
Код
C++ (Qt)
  QProcess *proc7;
 
  proc7 = new QProcess( this );
  proc7->addArgument("ls");
  proc7->addArgument("/mnt/cdrom");
  proc7->addArgument("|md5sum");
  connect( proc7, SIGNAL(readyReadStdout()),         this, SLOT(readFromStdout())  );
...
 
void MyDialog2::readFromStdout()
{
   textEdit2->append( proc7->readStdout() );
}
 
Контрольную сумму не выводит - как вывести КС cd-диска ?


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: crossly от Март 30, 2010, 16:15
повторяю второй раз... перенаправление ввода-вывода и пайпы это фишки оболочки (shell) ... QProcess никак на них не отреагирует...


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: BigHom от Апрель 02, 2010, 16:18
Так может по-другому можно как-то подсчитать? не с помощью QProcess... чтоб результат был такой же :-)


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: niXman от Апрель 02, 2010, 17:35
тебе 4 раза сказали как это правильно делать! я тебе код написал, несколькими постами выше!


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: kuzulis от Апрель 02, 2010, 18:31
Тут по аналогичному вопросу мне советовали создать .bat (windows) или .sh (*.nix) файл в котором прописать все что нужно и его запускать... (поищи по форуму)

Хотя, как вариант - можно попытаться подсунуть QProcess вызов cmd.exe (windows) или /bin/bash (*nix)  - а аргументами будут являться всё остальное ( ls, /mnt/cdrom и т.п.)


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: BigHom от Апрель 05, 2010, 11:07
тебе 4 раза сказали как это правильно делать! я тебе код написал, несколькими постами выше!
Выдаются следующие ошибки:
c:\Qt\MyDialog2.ui.h(1416): error C2062: type 'char' unexpected
c:\Qt\MyDialog2.ui.h(1416): error C2065: 'array' : undeclared identifier
c:\Qt\MyDialog2.ui.h(1414): error C2065: 'cerr' : undeclared identifier
c:\Qt\MyDialog2.ui.h(1414): error C2065: 'errno' : undeclared identifier
c:\Qt\MyDialog2.ui.h(1413): error C2065: 'ifstream' : undeclared identifier
c:\Qt\MyDialog2.ui.h(1413): error C2146: syntax error : missing ';' before identifier 'file'
c:\Qt\MyDialog2.ui.h(1417): error C2228: left of '.good' must have class/struct/union type
        type is ''unknown-type''
c:\Qt\MyDialog2.ui.h(1416): error C2653: 'boost' : is not a class or namespace name
c:\Qt\MyDialog2.ui.h(1413): error C2653: 'std' : is not a class or namespace name
c:\Qt\MyDialog2.ui.h(1414): error C2653: 'std' : is not a class or namespace name
c:\Qt\MyDialog2.ui.h(1413): error C3861: 'file': identifier not found, even with argument-dependent lookup
c:\Qt\MyDialog2.ui.h(1417): fatal error C1903: unable to recover from previous error(s); stopping compilation


Если устранить ошибки будет правильно подсчитана КС  cd-диска?


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: BigHom от Апрель 12, 2010, 08:56
Спасибо за помощь , контрольная сумма считается.  Но возник вопрос:
1) при записи на диск cd-диск , процесс длится достаточно долго и хотелось бы ,чтобы выдавалось сообщение на экран - типа "идёт запись", но сообщение появляется после записи , что-то не даёт выдаваться сообщению сразу же до :

bool result = proc.start() //возвращает 1
while(proc.isRunning()){}


Название: Re: Копирование файлов с помошью QProcess и cp! Проблема!!!
Отправлено: BRE от Апрель 12, 2010, 09:02
while(proc.isRunning()){}
Вот этот цикл и не дает.