Argument kommt nicht richtig bei QProcess an!

Alles rund um die Programmierung mit Qt
Antworten
Linuxguru
Beiträge: 96
Registriert: 14. Januar 2007 02:09

Argument kommt nicht richtig bei QProcess an!

Beitrag von Linuxguru »

Hallo,

ich habe das Problem, das mein Argument aus der Liste nicht richtig ankommt.

Hier erstmal etwas Code!

Code: Alles auswählen

	QString program = "mkisofs";
	QStringList burnArgs;
	burnArgs << "-r" << "-J" << "-o" << "/tmp/fcImage.iso";

	for(int i = 0; i < dataBurnList.count(); i++)
	{
		QFileInfo fi = dataBurnList.at(i);
		if(fi.isDir())
		{
			QString graftPoint = "-graft-points " + fi.fileName() + "=" + dataBurnList.at(i);
			burnArgs << graftPoint;
		}
		else
		{
			burnArgs << dataBurnList.at(i);
		}
	}

	myProcess = new QProcess(this);
	myProcess->start(program, burnArgs);

	connect(myProcess, SIGNAL(readyReadStandardOutput()),this, SLOT(readOutput()));
	connect(myProcess, SIGNAL(readyReadStandardError()),this, SLOT(readOutput()));
Bei QString graftPoint kommt als Ausgabe an der Konsole das -aft-Points kein gültiger Parameter ist. Kann sich jemand vorstellen, wo das "gr" von "-graft-Points" hin ist?

Wenn ich burnArgs abfrage, dann kommt der String da noch ordnungsgemäss an.

Dank im Voraus
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

1. Ich verstehe deine Frage ("Bei QString graftPoint kommt als Ausgabe an der Konsole..") nicht, weil auf der Zeile "QString graftPoint" keine Konsolenausgabe gemacht wird (keine QDebug-Ausgabe oder sonst was..). Meinst du damit im Debugger oder so?

2. folgender Test zeigte keinerlei Probleme:

Code: Alles auswählen

  QCoreApplication app(argc,argv);
  QString program = "arguments";
  QStringList burnArgs;
  burnArgs << "-r" << "-J" << "-o" << "/tmp/fcImage.iso";

  QString graftPoint = "-graft-points " + QString("X") + "=" + QString("test");
  burnArgs << graftPoint;

  QProcess *myProcess = new QProcess();

  myProcess->start(program, burnArgs);
  return app.exec();
In der Konsole:

Code: Alles auswählen

> cat arguments
echo $* >> /tmp/arguments.out
> ./processtest 
^C
> cat /tmp/arguments.out
-r -J -o /tmp/fcImage.iso -graft-points X=test
>
da kommt also alles richtig an. Die einzigen Bedenken die ich haette ist, dass jede Shell eine Limitierung in der Kommandlaenge hat... (siehe Kommando "getconf ARG_MAX"). Was also, wenn "dataBurnList.count()" sehr gross ist....?
Linuxguru
Beiträge: 96
Registriert: 14. Januar 2007 02:09

Beitrag von Linuxguru »

Danke für die Antwort.

Ich hab meine funktion nun mal auf das mindeste umgebaut.

hier mal ein stück code

Code: Alles auswählen

	QString program = "genisoimage";

    QStringList burnArgs;
    burnArgs << "-r" << "-J" << "-o" << "/tmp/fcImage.iso";

    QString graftPoint = "-graft-points " + QString("X") + "=" + QString("test");
    burnArgs << graftPoint;
	burnDataProcess = new QProcess(this);
	burnDataProcess->start(program, burnArgs);

	connect(burnDataProcess, SIGNAL(readyReadStandardOutput()),this, SLOT(readOutput()));
	connect(burnDataProcess, SIGNAL(readyReadStandardError()),this, SLOT(readOutput()));
}

Wenn ich das Tool nun ausführe, meldet mir readyReadStandardOutput()

Code: Alles auswählen

genisoimage: unrecognized option `-aft-points X=test'

Usage: genisoimage [options] -o file directory ...


Use genisoimage -help
to get a list of valid options.

Report problems to debburn-devel@lists.alioth.debian.org.

genisoimage: unrecognized option `-aft-points X=test'

Usage: genisoimage [options] -o file directory ...


Use genisoimage -help

to get a list of valid options.


Report problems to debburn-devel@lists.alioth.debian.org.

solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

genisoimage: unrecognized option `-aft-points X=test'
ich habe den Eindruck, dass das 2(!) Parameter sein sollten.. oder nicht?
Ich würde daher vorschlagen:

Code: Alles auswählen

   QString program = "genisoimage";
   QStringList burnArgs;
   burnArgs << "-r" << "-J" << "-o" << "/tmp/fcImage.iso";
   burnArgs << "-graft-points" << (QString("X") + "=" + QString("test"));
   burnDataProcess = new QProcess(this);
   burnDataProcess->start(program, burnArgs); 
Linuxguru
Beiträge: 96
Registriert: 14. Januar 2007 02:09

Beitrag von Linuxguru »

Hallo solarix,

das mit den 2 Parametern hatte ich auch schon getestet. Irgendwie hat er was gegen das gr bei -graft-points.
Sobald ich statt -graft-points -fffaft-points nehme, erkennt er den parameter korrekt.

Hab nun testweise mal die QT Version von 4.4.3 auf 4.5.3 geändert, trotz alledem kein Erfolg.

Was könnte es jetzt noch sein?
Linuxguru
Beiträge: 96
Registriert: 14. Januar 2007 02:09

Beitrag von Linuxguru »

Hallo solarix,

soeben hab ich es hinbekommen. So 100% kann ich den Fehler nicht nachvollziehen.
Hab mal den funktionierenden Code hier:

Code: Alles auswählen

void MainWindow::startBurnAction()
{
	QString program = "genisoimage";
	QStringList burnArgs;

	burnArgs << "-r" << "-J" << "-o" << "/tmp/fcImage.iso" << "-graft-points";

	for(int i = 0; i < dataBurnList.count(); i++)
	{
		QFileInfo fi = dataBurnList.at(i);
		if(fi.isDir() && fi.fileName() != "..")
		{
			burnArgs << fi.fileName() + "=" + dataBurnList.at(i);
		}
		else
		{
			burnArgs << dataBurnList.at(i);
		}
	}

	burnDataProcess = new QProcess(this);
	burnDataProcess->start(program, burnArgs);

	connect(burnDataProcess, SIGNAL(readyReadStandardOutput()),this, SLOT(readOutput()));
	connect(burnDataProcess, SIGNAL(readyReadStandardError()),this, SLOT(readOutput()));
}
Hab eigentlich nur den Parameter -graft-points ausserhalb der for Schleife aufgerufen, das er nur einmal aufgerufen wird.
Da das Problem aber vorher auch bei einen einzelnen Verzeichnis lag, kann ich es nur darauf schieben, das ich jetzt nicht vorher alles in einen String speichere, sondern direkt als Argument übergebe.

Evtl sieht du noch was anderes, was den Fehler hervorgerufen haben könnte.

Solange lass ich den Beitrag noch mal auf.

MfG
Antworten