QProcess-Argument mit eckigen Klammern -> Fehler?
QProcess-Argument mit eckigen Klammern -> Fehler?
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
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
Also hab ich das richtig verstanden, du startest ein Programm "mediainfo".
Ich schätze der Quellcode sieht wie folgt aus (bespiel):
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
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);
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
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:
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??
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()) {
}
}
(...)
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??
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
Vielleicht hilft es ja
mfg
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);
mfg
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:
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?
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);
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?
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...
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...
Ich vermute mal mit einer Art rekursivem QDir/QFile Konstrukt? Dann solltest du QStrings zurückbekommen bevor du die in die Datenbank steckst.Also ich lese aus einem Verzeichnis (samt Unterverzeichnissen) alle dort vorhandenen Video-Dateien ein und speichere den jeweiligen Dateipfad in einer Datenbank.
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;
Code: Alles auswählen
/* versucht hier infos zu bekommen */
if (/* keine Infos returned */) failedPaths << path;
}
@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...
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...