Ich erstelle gerade ein Programm, das mir hilft Bilddubletten zu finden und zu eliminieren. Die einzelnen Arbeitsschritte sind wie folgt:
1. in der Kommandozeile einen gegebenen Ort rekursiv nach *.jpg-Dateien durchsuchen, diese via Pipe durch md5sums (Linux) oder md5 (DOS/Win) hashen und Hash mit voll qualifiziertem Dateinamen in eine Datei schreiben.
Diese wird wiederum in der Kommandozeile sortiert und alle mehr als einmal auftauchenden Hashes werden mit zugehöriger Dateibezeichnung geordnet in eine 2. Datei geschrieben. Das funktioniert wie vorgesehen.
2. Jetzt kommt das Sichten und Löschen. Dafür soll mein Programm in einem Stringgrid zeilenweise Hash und Dateiname aus der sortierten Liste darstellen. Klicke ich die Zelle mit dem Hash doppelt, soll pro Datei mit diesem Hash ein Fenster mit Bildbetrachter aufgehen, der mir das entspr. Bild im übergebenen Verzeichnis anzeigt.
Es gibt für mich maßgebliche Gründe, das Bild mit einem Standard-Bildbetrachter anzuschauen und keine eigene Lösung zu basteln - u.a. ist der Aufwand dem Zweck einfach nicht angemessen.
Das automatische Öffnen der übergebenen Datei geht unter Windows auch sehr gut mit
Code: Alles auswählen
ShellExecute(0, nil, PChar(StringGrid.Cells[2, x]),nil,nil,3);
wobei in Spalte 2 der selektierten Zeile der vollständige Dateiname steht. Soweit bin ich schon, dass das klappt.
Aber: ich muss aus bestimmten Gründen sowohl unter Windows als auch unter Linux arbeiten und habe auf beiden (lokal getrennten und nicht vernetzbaren) Systemen Datenbestände zu entduplizieren.
Daher wäre anscheinend TProcess zum Öffnen des Viewers der geeignetste Kandidat. Wie aber übergibt man TProcess hier die Datei in der Weise, dass dann tatsächlich der jeweils systemseitig definierte Viewer gestartet und die übergebene Datei geladen wird? Kann momentan nur unter Windows testen aber nach mehreren Tests genügt es nicht, einfach nur die voll qualifizierte Datei zu übergeben, das hingegen würde funktionieren:
Code: Alles auswählen
aProcess := TProcess.Create(nil);
aProcess.CommandLine := 'C:\Programme\irfanview\i_view32.exe ' +
'"' + StringGrid.Cells[2, i] + '"';
aProcess.Options := AProcess.Options + [poWaitOnExit];
aProcess.Execute;
aProcess.Free;
Gibt es aber auch einen einfachen Weg, es ähnlich wie bei ShellExecute nur durch Übergabe der Dateiadresse zu schaffen, vielleicht durch eine Änderung in CommandLine? (Wie gesagt, ist nur für den Hausgebrauch und daher will ich die Kirche im Dorf lassen.)
Vielen Dank für jede Meldung
Aldicek