Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Eine Pfadangabe "säubern"? (https://www.delphipraxis.net/193807-eine-pfadangabe-saeubern.html)

Glados 11. Sep 2017 17:00

Eine Pfadangabe "säubern"?
 
Ich stelle mir gerade die Frage wie man am besten eine unsaubere Pfadangabe säubert.
Wie bekomme ich etwas Dreckiges wie
Delphi-Quellcode:
C:\\123/45\67.
sauber sodass ich
Delphi-Quellcode:
C:\123\45\67
erhalte?
Aktuell mache ich das so aber das ist sicher nicht so dolle oder?

Delphi-Quellcode:
begin
 if Trim(aDir) = '' then
  begin
   Result := '';
   Exit;
  end;

  // Wenn aDir eine Dateiangabe ist warum auch immer, dann ...
  // aDir := ExtractFileDir(aDir);

 aDir := StringReplace(aDir, '/', '\', [rfReplaceAll]);

 while (AnsiEndsStr('\', aDir)) or AnsiEndsStr('.', aDir) do
  aDir := Copy(aDir, 1, Length(aDir) - 1);

 while Pos('\\', aDir) > 0 do
  aDir := StringReplace(aDir, '\\', '\', [rfReplaceAll]);

 while Pos('\ ', aDir) > 0 do
  aDir := StringReplace(aDir, '\ ', '\', [rfReplaceAll]);

 Result := Trim(aDir);
end;
Ich bin ein totaler Spagetti-Coder und möchte natürlich Neues lernen!

p80286 11. Sep 2017 17:28

AW: Eine Pfadangabe "säubern"?
 
Woher kommen denn diese "dreckigen" Pfadangaben?
Hintergrund meiner Frage ist: es könnte sich jemand etwas dabei gedacht haben!

Gruß
K-H

Glados 11. Sep 2017 17:35

AW: Eine Pfadangabe "säubern"?
 
Das können Benutzereingaben sein.
Ziel von mir ist es aber, alles was nicht dem Standard entspricht wegzufegen.
Doppelte Querstriche oder welche die falsch herum sind, oder das erste Zeichen nach einem \ sollte auch kein Leerzeichen sein (C:\123\ 456\789\)
und das letzte Zeichen eines Pfades sollte auch kein . sein. Das entfernt mein Code ja. Nur sicherlich alles andere als gut.

sakura 11. Sep 2017 20:55

AW: Eine Pfadangabe "säubern"?
 
Und schon rennst Du in das erste Problem, da z.B. Netzwerkverweise meist mit \\ beginnen, z.B.
Code:
\\Servername\Pfad\Pfad\Datei.xyz
Aus Erfahrung, versuche nicht zu bereinigen, sondern zu testen, ob die Eingabe sich verarbeiten lässt (z.B.: TFile.Exists, TDirectory.Exists, ...).

...:cat:...

Glados 11. Sep 2017 21:08

AW: Eine Pfadangabe "säubern"?
 
Zitat:

Wie bekomme ich etwas Dreckiges wie C:\\123/45\67. sauber sodass ich C:\123\45\67 erhalte?
Reicht das, wenn ich das doppelt schreibe?

sakura 11. Sep 2017 21:15

AW: Eine Pfadangabe "säubern"?
 
Zitat:

Zitat von Glados (Beitrag 1380841)
Zitat:

Wie bekomme ich etwas Dreckiges wie C:\\123/45\67. sauber sodass ich C:\123\45\67 erhalte?
Reicht das, wenn ich das doppelt schreibe?

Wie meinst Du diesen letzten Beitrag? Ich wollte lediglich darauf hinweisen, dass es auch andere legale Pfade gibt, welche durch das entfernen des doppelten \\ zerstört werden - sprich deine obige Routine würde zu einem ungültigen Pfad führen...

...:cat:...

nahpets 11. Sep 2017 21:39

AW: Eine Pfadangabe "säubern"?
 
Und nicht vergessen, Leerzeichen sind in Pfadangaben durchaus erlaubt.

C:\123\ 456\789\ ist zulässig, wenn auch ungewöhnlich, von daher ist der Vorschlag, die Pfade zu prüfen, sinnvoll.

Wenn dann ein Pfad ungültig ist, kann man versuchen, ihn durch das Ersetzen von (vermutlich) fehlerhaften Zeichen zu bereinigen und dann mit dem Bereinigten erneut probieren, ob es nun ein gültiger Pfad ist.

Und / statt \ funktioniert unter Windows (außer auf der Kommandozeile) auch schon etwas länger. Allerdings ist eine einheitliche Nutzung sicher vorzuziehen.

p80286 11. Sep 2017 21:42

AW: Eine Pfadangabe "säubern"?
 
Also im Prinzip bist Du auf dem richtigen Weg. ich empfehle Dir nur Dich zuerst hier zu informieren.

Ich habe den Eindruck daß du ein etwas rustikales Vorgehen bevorzugst.

Gruß
k-H

Glados 11. Sep 2017 22:39

AW: Eine Pfadangabe "säubern"?
 
Zitat:

C:\123\ 456\789\ ist zulässig
Wie schafft man es denn ein Verzeichnis mit [Leerzeichen]456 abzuspeichern? Habe ich bisher noch nie geschafft.

Zitat:

Ich wollte lediglich darauf hinweisen, dass es auch andere legale Pfade gibt, welche durch das entfernen des doppelten \\ zerstört werden
Ich hätte besser anfügen sollen, dass ich an einer anderen Stelle mittlerweile prüfen, ob es sich um einen Netzwerkpfad handelt. Klappt wunderbar.

Delphi-Quellcode:
var
 bIsDirectory, bIsNetworkPath: Boolean;
begin
 aPath := Trim(aPath);

 if aPath = '' then
  begin
   Result := '';
   Exit;
  end;

 aPath := StringReplace(aPath, '/', '\', [rfReplaceAll]);

 bIsNetworkPath := Copy(aPath, 1, 2) = '\\';
 bIsDirectory := ist aPath ein Verzeichnis? ...

 // Wenn aDir eine Dateiangabe ist warum auch immer, dann ...
 // aDir := ExtractFileDir(aDir);


 while Pos('\ ', aPath) > 0 do
  aPath := StringReplace(aPath, '\ ', '\', [rfReplaceAll]);

 if not bIsNetworkPath then
  while Pos('\\', aPath) > 0 do
   aPath := StringReplace(aPath, '\\', '\', [rfReplaceAll]);

 while (AnsiEndsStr('\', aPath)) or AnsiEndsStr('.', aPath) do
  aPath := Copy(aPath, 1, Length(aPath) - 1);

 Result := Trim(aPath);
end;
Zitat:

Ich habe den Eindruck daß du ein etwas rustikales Vorgehen bevorzugst.
Wie genau meinst du das?
Wenn es hierfür was Fertiges gäbe, würde ich es sofort nehmen.

Auf etwa dieselbe Art und Weise habe ich auch etwas zusammengebaut, was verbotene Zeichen in Dateinamen entfernt.
Da aber mit einem Array.

nahpets 11. Sep 2017 22:52

AW: Eine Pfadangabe "säubern"?
 
Zitat:

Zitat von Glados (Beitrag 1380855)
Zitat:

C:\123\ 456\789\ ist zulässig
Wie schafft man es denn ein Verzeichnis mit [Leerzeichen]456 abzuspeichern? Habe ich bisher noch nie geschafft.

Aus Delphi heraus z. B. mit
Delphi-Quellcode:
ForceDirectories('c:\123\ 456\789\');
, von der Kommandozeile mit
Delphi-Quellcode:
md "c:\123\ 456\789\"


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:34 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz