[gelöst] Explorer mit Verzeichnis öffnen (Leerzeichen im Namen)

Antworten
oleg
Beiträge: 31
Registriert: So 6. Okt 2019, 17:04
OS, Lazarus, FPC: Win10Pro-(Laz 2.2.0 - FPC 3.2.0)-Rasp4(8GB)+MySQL+GITEA 1.20.2 <-> GIT 2.44.0
Wohnort: Leipzig

[gelöst] Explorer mit Verzeichnis öffnen (Leerzeichen im Namen)

Beitrag von oleg »

Hallo liebe Community.
Ich wünsche allen an dieser Stelle noch ein gesundes und erfolgreiches neues Jahr 2025.

Ich benötige bitte Eure Hilfe bei folgenden Problem. Ich habe in einem Dokumentationsprogramm einige Dateien die im Dateisystem gespeichert werden. Den jeweiligen Pfad kann der Benutzer eigentlich nicht wissen, deshalb möchte ich ihm per Button den Standardexplorer im gewählten Verzeichniss öffnen.

eigebunden per uses ist die ShellApi und die LCLIntf
eigentich funktioniert dieser Aufruf mit dem direkt genannten Verzeichnis.

Code: Alles auswählen

// diese Codezeilen funktionieren, sind aber nicht variabel
ShellExecute(Application.Handle,PChar('explore'),'c:\dokumente',nil,nil,SW_SHOW);
ShellExecute(Application.Handle,'open','c:\dokumente',nil,nil,SW_MAXIMIZE);
OpenDocument('c:\dokumente');
das eigentliche Problem:
wird das Verzeichnis vorher in eine Variable übergeben, funktioniert das nicht mehr, wenn der Pfad nicht gefunden wird z.b. wegen einem Leerzeichen

Code: Alles auswählen

var strFolder : String;

begin
 strFolder := AppConfig.DokumentRoot + DirectorySeparator + IntToStr(doc.Group);
 ShellExecute(self.Handle,'explore',PChar('/e,'+ QuotedStr(UTF8ToSys(strFolder))),NIL,NIL, SW_SHOW);  
end;
 
Die genaue Bezeichnung des Verzeichnisses ist in diesem Fall: F:\Tool Dokumente\HomeOffice\1100

Um mögliche Probleme mit Sonderzeichen zu vermeiden, würde ich die UTF8ToSys verwenden. Die Funktion QuotedStr sollte mir die benötigen Anführungszeichen liefern. Die Überprüfung des gültigen Pfades mit ShowMessage(strFolder) und im Debuger ist erfolgreich.

Der erzwungene Windows Explorer sollte Parameter unterstützen, gefunden hier: https://it-und-web.de/tipps/Windows_Exp ... ter_Werte/
Zuletzt geändert von oleg am So 5. Jan 2025, 14:23, insgesamt 1-mal geändert.

around5
Beiträge: 14
Registriert: Fr 16. Aug 2024, 08:14

Re: Explorer mit Verzeichnis öffnen (Leerzeichen im Namen)

Beitrag von around5 »

QuotedStr verwendet Single-Quotes. Für Windows in der Shell werden aber Double-Quotes benötigt.

Hierzu TStringHelper.QuotedString (https://www.freepascal.org/docs-html/rt ... tring.html) verwenden. Die Beschreibung ist nicht korrekt. Der Default-Wert für AQuoteChar ist das Single-Quote. Daher konkret:

Code: Alles auswählen

UTF8ToSys(strFolder).QuotedString('"')

oleg
Beiträge: 31
Registriert: So 6. Okt 2019, 17:04
OS, Lazarus, FPC: Win10Pro-(Laz 2.2.0 - FPC 3.2.0)-Rasp4(8GB)+MySQL+GITEA 1.20.2 <-> GIT 2.44.0
Wohnort: Leipzig

Re: Explorer mit Verzeichnis öffnen (Leerzeichen im Namen)

Beitrag von oleg »

Vielen Dank für den sehr schnellen Lösungsvorschlag.

.QuotedString('"') ist absolut korrekt, danke

nur die eigentliche Problem löst sich damit leider noch nicht.
Während die erste Codezeile den Explorer wunschgemäß im Verzeichnis C:\Windows öffnet, funktioniert die zweite Zeile mit der Variable nicht.

Code: Alles auswählen


  ShellExecute(Application.Handle, 'explore', 'C:\Windows', nil, nil, SW_SHOWNORMAL);
  // funktiioniet nicht
  ShellExecute(Application.Handle, 'explore', PChar(strFolder.QuotedString('"')), nil, nil, SW_SHOWNORMAL);  



Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 296
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Explorer mit Verzeichnis öffnen (Leerzeichen im Namen)

Beitrag von Jorg3000 »

Lass doch einfach mal das QuotedString() weg, denn das ist hier nicht nur überflüssig, sondern auch falsch.
Die Funktion ist ja keine Kommandozeile, sondern der Parameter ist nur ein Element daraus.
Die Funktion erwartet in dem Parameter die Pfadangabe - und darin sind Anführungszeichen nicht erlaubt.

oleg
Beiträge: 31
Registriert: So 6. Okt 2019, 17:04
OS, Lazarus, FPC: Win10Pro-(Laz 2.2.0 - FPC 3.2.0)-Rasp4(8GB)+MySQL+GITEA 1.20.2 <-> GIT 2.44.0
Wohnort: Leipzig

Re: Explorer mit Verzeichnis öffnen (Leerzeichen im Namen)

Beitrag von oleg »

Vielen Dank für deine Unterstützung. Den Fehler konnte ich nun eingrenzen.

QuotedStr und QuotedString nun auch noch weggelassen. Vielen Dank. Funktioniert jetzt genauso richtig.

Mit GetLastError = 2 -> Pfad nicht vorhanden, habe ich jetzt die Lösung gefunden.

Ich habe im Tool das betreffende Verzeichnis nochmal korrekt gesetzt, die Werte der Variablen mit den abgefragten und dem Dateiverzeichnis verglichen und habe festgestelt, da tatsächlich ein Unterordner noch nicht eingebunden war.
also:

Code: Alles auswählen

strFolder := Hauptverzeichnis + DirectorySeparator + Unterverzeichnis + DirectorySeparator + Datenverzeichnis

ShellExecute(Application.Handle, 'explore', PChar(UTF8ToSys(strFolder)), nil, nil, SW_SHOWNORMAL);  

Ich werde jetz noch versuchen den Fehler sichtbar zu machen, wenn es ein Datenverzeichnis nicht gibt um den Anwender zu informieren, dass er erst Daten ablegen muss.
if ShellExecute(0,nil, PChar('"C:\my dir\prog.exe"'),PChar('"C:\somepath\some_doc.ext"'),nil,1) =2 then
...

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 296
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: [gelöst] Explorer mit Verzeichnis öffnen (Leerzeichen im Namen)

Beitrag von Jorg3000 »

Das letztgenannte ShellExecute()=2 ist eine sehr interessante Lösung, um das Vorhandensein eines Ordners zu prüfen. :D

Einfacher geht es mit DirectoryExists() aus Unit SysUtils, was zudem Betriebssystem-übergreifend funktioniert.

Antworten