AGB  ·  Datenschutz  ·  Impressum  







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

Existenz langer Pfade

Ein Thema von tomkupitz · begonnen am 3. Jul 2017 · letzter Beitrag vom 4. Jul 2017
Antwort Antwort
Seite 1 von 3  1 23      
tomkupitz

Registriert seit: 26. Jan 2011
339 Beiträge
 
Delphi 12 Athens
 
#1

Existenz langer Pfade

  Alt 3. Jul 2017, 20:50
Hallo,

ich prüfe ob ein langer Pfad existiert mit:

Code:
function DirExists(const Dirname: string): Boolean;
var FindData: TWin32FindData;
    Handle: THandle;

begin
  Handle:=FindFirstFileW(PWideChar('\\?\'+Dirname+#0#0), FindData);

  if Handle<>INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);

    result:=FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> 0;
  end
  else
    result:=False;
end;
Wenn Dirname ein Netzwerkpfad ist \\QNAP\abc ist funktioniert das nicht. Warum?

Beste Grüße
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#2

AW: Existenz langer Pfade

  Alt 3. Jul 2017, 21:20
Ich kann das jetzt nicht testen und will mir ehrlich gesagt keinen Pfad >255 auf einem Netzlaufwerk anlegen.

-- das hier ist offensichtlich falsch, also weg damit --
Aber lasse die ersten zwei \\ deines Netzwerkpfades mal weg. Denn \\?\QNAP\ ist glaube ich zulässig, nicht aber \\?\\\QNAP\.

Geändert von SneakyBagels ( 3. Jul 2017 um 22:14 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Existenz langer Pfade

  Alt 3. Jul 2017, 21:32
Ich verstehe nicht - Willst du überprüfen ob es ein "langer Pfad" ist, also länger ist als die Windows-Konstante "MAX_PATH"? Oder willst du wissen ob der Pfad in UNC-Notation (\\host\path) ist?

Für letzteren Fall: Nimm einfach TPath.IsUncPath()

Die Antwort auf dein "Warum funktioniert das nicht?" ist dass du explizit nach lokal fragst.
https://de.wikipedia.org/wiki/Uniform_Naming_Convention
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Existenz langer Pfade

  Alt 3. Jul 2017, 22:05
https://de.wikipedia.org/wiki/Uniform_Naming_Convention

Da steht eigentlich alles drin. Für die wikipedia-Hasser "\\?\" bezeichnet ein lokales Laufwerk. auch wenn man einen servernamen hinten dran hängt bleibt es lokal, da wird nichts draus.

Gruß
K-H

Ok vergiss es ich bin einen Hundespaziergang zu spät
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#5

AW: Existenz langer Pfade

  Alt 3. Jul 2017, 22:23
Ich schicke meine Pfade immer alle durch die erste Funktion. Bisher lief immer alles glatt. Vielleicht hilft das ja
Delphi-Quellcode:
function getUNCPath(aPath: string): string;
begin
 if not Winapi.ShLwApi.PathIsNetworkPath(PWideChar(aPath)) then
  if not System.IOUtils.TPath.IsUNCPath(aPath) then
   aPath := '\\?\' + aPath;

 Result := aPath;
end;

function removeUNCFromPath(aPath: string): string;
begin
 if not Winapi.ShLwApi.PathIsNetworkPath(PWideChar(aPath)) then
  if System.IOUtils.TPath.IsUNCPath(aPath) then
   Delete(aPath, 1, 4);

 Result := aPath;
end;

// Test
 ShowMessage( getUNCPath('Y:\') ); // Y = Netzlaufwerk. Resultat => Y:\
 ShowMessage( getUNCPath('C:\') ); // C = Systemlaufwerk. Resultat => \\?\C:\
  Mit Zitat antworten Zitat
tomkupitz

Registriert seit: 26. Jan 2011
339 Beiträge
 
Delphi 12 Athens
 
#6

AW: Existenz langer Pfade

  Alt 3. Jul 2017, 22:40
Danke für die Hinweise.

Es geht um eine kleine Backupfunktion die Ordner in einen Zielordner kopiert. Quell- oder Zielordner können im Netzwerk liegen.
Nun kam es vor, dass einige Pfade in den Quellordnern größer als MAX_PATH wurden oder gar Dateinamen Überlänge hatten. D.h. es kam folglich dazu, dass Quell- und Zielordner nicht gleich waren. Kurz: Welche Möglichkeit habe ich ausser "\\?\" Dateien mit langen Pfaden oder Dateinamenüberlänge mit CopyFile zu kopieren?

Beste Grüße
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#7

AW: Existenz langer Pfade

  Alt 3. Jul 2017, 22:51
Ich stand mal vor demselben Problem wie du.
Kurz: außer \\?\ wird dir nicht viel übrig bleiben. Wenn es was anderes gibt, kenne ich es nicht.

Nutze einfach meine Funktion getUNCPath. Die macht aus allen Pfaden UNC-Pfade und wenn dein Pfad ein Netzwerkpfad ist, macht die Funktion nichts.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#8

AW: Existenz langer Pfade

  Alt 4. Jul 2017, 01:59
Es gibt noch ein anderes Prefix "\??\", das für Reparse Points verwendet wird. Leider habe ich mangels Verständnis des Themenkomplexes keine Ahnung, ob das vielleicht auch für UNC funktioniert. Vielleicht einen Versuch wert?

Grüße
Dalai
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#9

AW: Existenz langer Pfade

  Alt 4. Jul 2017, 12:40
Also laut dieser Doku https://msdn.microsoft.com/en-us/lib...).aspx#maxpath sollte es möglich sein, das wie folgt zu schreiben:

Code:
\\?\UNC\QNAP\abc
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#10

AW: Existenz langer Pfade

  Alt 4. Jul 2017, 12:53
Siehe:

Ich verstehe nicht - Willst du überprüfen ob es ein "langer Pfad" ist, also länger ist als die Windows-Konstante "MAX_PATH"? Oder willst du wissen ob der Pfad in UNC-Notation (\\host\path) ist?

Für letzteren Fall: Nimm einfach TPath.IsUncPath()

Die Antwort auf dein "Warum funktioniert das nicht?" ist dass du explizit nach lokal fragst.
https://de.wikipedia.org/wiki/Uniform_Naming_Convention
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 02:39 Uhr.
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