QProcess-Argument mit eckigen Klammern -> Fehler?

Alles rund um die Programmierung mit Qt
Antworten
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

QProcess-Argument mit eckigen Klammern -> Fehler?

Beitrag 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
tribari
Beiträge: 63
Registriert: 23. Juli 2008 13:31
Wohnort: Braunschweig

Beitrag 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
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag 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??
tribari
Beiträge: 63
Registriert: 23. Juli 2008 13:31
Wohnort: Braunschweig

Beitrag 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
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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...
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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.
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag 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...
Antworten