AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eine Pfadangabe "säubern"?

Ein Thema von Glados · begonnen am 11. Sep 2017 · letzter Beitrag vom 14. Sep 2017
Antwort Antwort
Seite 1 von 2  1 2      
Glados
(Gast)

n/a Beiträge
 
#1

AW: Eine Pfadangabe "säubern"?

  Alt 11. Sep 2017, 17:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.420 Beiträge
 
Delphi 12 Athens
 
#2

AW: Eine Pfadangabe "säubern"?

  Alt 11. Sep 2017, 20:55
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, ...).

......
Lizbeth W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#3

AW: Eine Pfadangabe "säubern"?

  Alt 11. Sep 2017, 21:08
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?
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.420 Beiträge
 
Delphi 12 Athens
 
#4

AW: Eine Pfadangabe "säubern"?

  Alt 11. Sep 2017, 21:15
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...

......
Lizbeth W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

AW: Eine Pfadangabe "säubern"?

  Alt 11. Sep 2017, 21:39
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Eine Pfadangabe "säubern"?

  Alt 11. Sep 2017, 21:42
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#7

AW: Eine Pfadangabe "säubern"?

  Alt 11. Sep 2017, 22:39
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.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: Eine Pfadangabe "säubern"?

  Alt 11. Sep 2017, 22:52
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 ForceDirectories('c:\123\ 456\789\'); , von der Kommandozeile mit md "c:\123\ 456\789\"
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#9

AW: Eine Pfadangabe "säubern"?

  Alt 12. Sep 2017, 07:53
Das ist gut zu wissen. Ich sollte dem Windows-Explorer weniger Beachtung schenken.

Dann kann das hier ja schon einmal raus
Delphi-Quellcode:
while Pos('\ ', aPath) > 0 do
 aPath := StringReplace(aPath, '\ ', '\', [rfReplaceAll]);
Auch geändert habe ich das hier
Delphi-Quellcode:
 // bIsNetworkPath := Copy(aPath, 1, 2) = '\\';
 bIsNetworkPath := IsUNCPathEx(aPath);
Delphi-Quellcode:
// (teils aus der DP-Suche)

function IsUNCPathEx(aPath: string): Boolean;
begin
 // true: aPath = \\server\path, \\?\server\path or \\?\UNC\server\path
 Result := GetUNCPrefix(aPath) <> '';
end;

function GetUNCPrefix(aPath: string): string;
begin
 Result := '';

 case GetExtendedPrefix(aPath) of
  pptExtended:
   Result := '\\?\';
  pptExtendedUNC:
   Result := '\\?\UNC\'
 else
  if Copy(aPath, 1, 2) = '\\then
   Result := '\\';
 end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.553 Beiträge
 
Delphi 12 Athens
 
#10

AW: Eine Pfadangabe "säubern"?

  Alt 12. Sep 2017, 08:48
Warum willst du eigentich sowas ändern?

Vorallem Windows ist da sehr Fehlertolerant und lässt Vieles durch,
* Punkt am Ende (leere Dateierweiterung)
* / statt \
* \\ in Pfaden (also "leere" Verzeichnisnamen, welche einem \.\ entsprechen würden und was \\ im Root betrifft, das wurde ja schon erwähnt)

Fast immer würde der "fehlerhafte" Pfad von den meisten APIs verstanden werden und wenn nicht, dann soll eben der Benutzer seine Falscheingabe berichtigen.
Im Gegenzug kannst du so "valide" Pfade fälschlich zerstören, wenn du sie nach falschen Regeln veränderst.

C:\WINDOWS\clock.avi
file:///C:/WINDOWS/clock.avi
file://localhost/C:/WINDOWS/clock.avi
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz