Seite 1 von 1

QProcess-Argument mit eckigen Klammern -> Fehler?

Verfasst: 19. Oktober 2010 13:36
von listeman
Hallo Leute,

in meinem kleinem Programm starte ich ein externes Programm mittels QProcess::execute(program,args).
In dem QStringList args befindet sich u.a. ein Dateiname, der sich jedsmal dynamisch ändert (je nach Nutzereingabe). Wenn dieser Dateiname jetzt jedoch eckige Klammern enthält, also [ oder ], dann findet <program> (in meinem fall "mediainfo") die Datei nicht. Ich habe schon probiert, den eckigen Klammern einen Backslash \ vorzusetzen, doch dies hat keine Änderung bewirkt... über google & co habe ich keine nennenswerten Vorschläge gefunden...

Wie aber kann ich dies anstellen??

Schon einmal Danke für jede Hilfe :)

Viele Grüße
listeman

Verfasst: 19. Oktober 2010 14:43
von tribari
Also hab ich das richtig verstanden, du startest ein Programm "mediainfo".

Ich schätze der Quellcode sieht wie folgt aus (bespiel):

Code: Alles auswählen

QString program = "C:\\IrgendEinPfad\\Mediainfo.exe";
QStringList args;
args << "C:\\IrgendEinPfad\\Verzeichnis\\Dateiname[A].txt";

QProcess::execute(program,args);
Liegt das Problem nun beim Aufruf des Programms, d.h. QProcess übergibt die Parameter nicht richtig, oder das Programm kann die Datei nicht öffnen?

Allgemein vermute ich zweiteres - was jedoch bedeutet das du da nicht gross was dran ändern könntest - weil das dann ein Problem von "mediainfo" wäre bei der Verarbeitung der Aufrufparameter...

mfg

Tribari

Verfasst: 19. Oktober 2010 20:48
von listeman
Erstmal Danke für dein Antwort :)

Sorry, hätte vermutlich ein wenig mehr Info geben sollen...

Also ich lese aus einem Verzeichnis (samt Unterverzeichnissen) alle dort vorhandenen Video-Dateien ein und speichere den jeweiligen Dateipfad in einer Datenbank. In einem weiteren Schritt nehme ich jede einzelne Datei, rufe mit dem Dateipfad das kleine Konsolenprogramm mediainfo auf, das mir ne ganze Menge Infos, wie Länge, Codecs, etc. über die Video-Datei gibt.

Das funktioniert generell auch problemlos - doch es scheitert an Dateien mit eckigen Klammern im Dateinamen. Generell sind für mediainfo eckige Klammern kein Problem, denn wenn ich von der Konsole "mediainfo -X -i /pfad/zu/der/Bei[spiel]datei.mp4" aufrufe, dann bekomme ich alle gewünschten Infos.
Nur das übergeben in Qt funktioniert aus irgendeinem Grund nicht. Hier ist mal ein Ausschnitt des dafür verantwortlichen Codes:

Code: Alles auswählen

(...)

QSqlQuery query = db.exec("SELECT filepath FROM files");

while(query.next()) {

	QStringList args;
	args << "-X" << "-i" << query.value(query.record().indexOf("filepath")).toByteArray().replace("\\'","'").trimmed();

	mediainfo->start("mediainfo",args);

	while(mediainfo->waitForFinished()) {
	}

}

(...)
mediainfo habe ich mit einer Funktion verbunden, die die Ausgabe auswertet. Das alles funktioniert auch einwandfrei, doch eben bei Dateien mit eckigen Klammern bekomme ich keine Ausgabe.

Also ich vermute, dass das ein Problem in meinem Code ist...


Edit:
Ich habe mal anstatt den Dateinamen aus der Datenbank zu nehmen, einen Dateinamen, der eckige Klammern enthält fest einprogrammiert (also: args << "-X" << "-i" << "/B/e/isp[iel]datei.mp4"). Dies bringt ebenfalls einen Fehler... wird vielleicht von QProcess::execute() Sachen innerhalb von [] "verändert", also ich meine, müssen die Klammern evtl. irgendwie maskiert werden??

Verfasst: 20. Oktober 2010 07:59
von tribari
lach,

ja da hättest du etwas mehr schreiben sollen - dachte es wär so nen typischer Fehler wo man öfter nicht dran denkt ;-)

Versuch mal den Process nicht mit einer Liste an Argumenten zu starten, sondern die Argumente direkt in der <program> Variable mit Leerzeichen hintendran zu hängen.

Hatte mal ein ähnliches Problem - das Programm wollte sich trotz richtig gesetzter Argumente nicht starten lassen - erst der Weg wie oben beschrieben hat geholfen. Erklären konnte ich mir das auch nicht ;-)

Code: Alles auswählen

QString program = "C:\\IrgendEinPfad\\programm.exe C:\\IrgendEinPfad\\dateiname[A].txt";
QProcess::execute(program);
Vielleicht hilft es ja :D

mfg

Verfasst: 22. Oktober 2010 13:33
von listeman
Ja, Danke, das funktioniert für die eckigen Klammern :)

Doch nun habe ich ein Problem mit doppelten Anführungszeichen ". Egal, ob ich die direkt an die program-Variable dranhänge oder in ne StringList packe, ich habe dasselbe Problem wie mit den eckigen Klammern... und wenn ich manuell über die konsole "mediainfo -X -i /pfad/zu/\"der\"datei.mp4" aufrufe, funktionierts super!

Hier sind für beide Varianten der Code-Ausschnitt:

Code: Alles auswählen

mediainfo->start("mediainfo -X -i \"" + query.value(query.record().indexOf("filepath")).toByteArray().replace("\\'","'").replace("\"","\\\"") + "\"");

Code: Alles auswählen

QStringList args;
args << "-X" << "-i" << query.value(query.record().indexOf("filepath")).toByteArray().replace("\\'","'");
mediainfo->start("mediainfo",args);
Bei beiden wird eine leere Ausgabe zurückgegeben. Ich habe auch schon versucht, beim zweiten ebenfalls ein ".replace("\"","\\\"")" anzuhängen, doch dies bring keine Änderung.
Und wenn ich bei der ersten Variante den kompletten Pfad nicht in Anführungszeichen setze (was ich ja für die eckigen Klammern hinzugefügt habe, dann ändert dies ebenfalls nichts.

Wie schon erwähnt, dies ist kein Fehler von mediainfo, sondern es hakt irgendwo im Code beim Übergeben des Pfades als Argument - doch wo?

Verfasst: 22. Oktober 2010 13:39
von franzf
Sry, wer solche Zeichen in Dateinamen packt gehört geviertelt und danach gevierteilt...
Ich hab keine AHnung ob das geht, denn die Anführungszeichen sind dazu da Zeichen zu einem String zusammenzufassen. Wenn dir da die cmd dazwischenfunkt (also selber nochmal an den Anfang und ans Ende Anführungszeihen setzt) hast du verloren...

Verfasst: 22. Oktober 2010 14:31
von padreigh
Also ich lese aus einem Verzeichnis (samt Unterverzeichnissen) alle dort vorhandenen Video-Dateien ein und speichere den jeweiligen Dateipfad in einer Datenbank.
Ich vermute mal mit einer Art rekursivem QDir/QFile Konstrukt? Dann solltest du QStrings zurückbekommen bevor du die in die Datenbank steckst.

Ich mag so lange Einzeiler nicht ... ich würds wohl so machen:

Code: Alles auswählen

QStringList failedPaths;
while(query.next()) {
     int index = query.record().indexOf("filepath"); // ändert sich das jedes Mal? Sonst vor die Schleife ziehen
     QString path = query.value(index).toString();
     qDebug() << "Das kommt aus DB raus:"  << path;
und dann sowas wie

Code: Alles auswählen

     /* versucht hier infos zu bekommen */
     if (/* keine Infos returned */) failedPaths << path;
}
Dann kannst du das rödeln lassen und siehst dann alle ge-fail-ten Inputs.

Verfasst: 26. Oktober 2010 21:38
von listeman
@franzf
Naja, das kommt halt vor... ich habe einige Videos von YouTube heruntergeladen, die automatisch den YouTube-Titel bekommen, manche davon halt mit Anführungszeichen... alle manuell zu ändern - wäre mir echt zuviel :)

@padreigh
Welche Pfade Probleme verursachen, das weiß ich. Das lese ich ähnlich wie du aus. Das Problem sind nur die Dateien mit Anführungszeichen im Dateinamen. Mein Problem ist, die einem QProcess::execute() zu übergeben. Da schlägt irgendwas fehl...


Momentan mache ich das folgendermaßen, dass ich die Dateien mit Anführungszeichen im Dateinamen umbenenne und dabei die doppelten Anführungszeichen " mit einfachen ' ersetze. Das funktioniert zwar, jedoch muss es doch irgendwie möglich sein, Anführungszeichen einem QProcess:execute() zu übergeben. Ich maskier die ja auch, doch bisher habe ich leider keinen Erfolg gehabt...