Entwickler-Ecke

Windows API - Prüfen ob Root-Directory


AScomp - So 20.09.09 04:25
Titel: Prüfen ob Root-Directory
Hallo,

in einem Programm möchte ich die Ordnerattribute eines Quellordners mit denen des Zielordners synchronisieren (sprich: der Zielordner soll exakt dieselben Attribute erhalten).

Jetzt stellt sich folgendes Problem dar: Ist der Quellordner ein Root-Verzeichnis (z.B. 'c:\'), funktioniert das nicht wie gewünscht (der Zielordner sollte NICHT die Attribute vom Root-Verzeichnis bekommen).

Wie kann ich jetzt prüfen, ob "c:\" ein Root-Verzeichnis ist? Ich könnte theoretisch prüfen, ob der Quellordner im Format "X:\" ist - allerdings würde es dann bei Netzwerk-Ordnern nicht mehr funktionieren (die lauten ja beispielsweise "\\Netzwerkrechner\c\").

Gibt es eine einfache Möglichkeit oder gar eine Funktion, mit der ich prüfen kann, ob es sich um ein Root-Verzeichnis handelt? Oder alternativ - wie ließe sich folg. Code für diese Problematik optimieren:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure SynchronizeFolderAttr(SourceFolder, TargetFolder: String);
var
   FileAttributes: Integer;
begin
     FileAttributes := FileGetAttr(SourceFolder);
     if FileAttributes <> INVALID_FILE_ATTRIBUTES then
        FileSetAttr(TargetFolder, FileAttributes);
end;


Eine weitere Alternative wäre wohl zu prüfen, ob es sich überhaupt um einen Ordner handelt. Allerdings geht das zumindest über FileGetAttr auch nicht, da "c:\" als faDirectory erkannt wird.

Herzlichen Dank für alle Tipps!


Delete - So 20.09.09 09:07

Vielleicht hilft das:
NetDfsGetInfo Function
in Level ist die Info.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function NetDfsSetInfo; external netapi32lib name 'NetDfsSetInfo';

function NetDfsGetInfo(DfsEntryPath, ServerName, ShareName: LPWSTR;
  Level: DWORD; Buffer: Pointer): NET_API_STATUS;
begin
  if CheckNetAPILoaded(@_NetDfsGetInfo, 'NetDfsGetInfo'then
    Result := _NetDfsGetInfo(DfsEntryPath, ServerName, ShareName, Level, Buffer)
  else
    Result := APINotPresentErrorCode; 
//stattdessen Level herausfiltern
end;


http://msdn.microsoft.com/en-us/library/bb524812%28VS.85%29.aspx

Alternative:
if pos(':', path)=1 then ...zählen, wieviele Zeichen rechts davon stehen. Mehr als 1 sollte es nicht sein beim Root-Verzeichnis.


AScomp - So 20.09.09 16:41

Das scheint nur für Netzwerke zu funktionieren, nicht aber für lokale Festplatten. Und auch bei Netzwerken hab ich es noch nicht 100%ig zum Laufen bekommen. :(

Die Alternative macht wie gesagt nur Sinn bei lokalen Festplatten und versagt hingegen bei Netzwerken.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Hab eine Lösung gefunden.

Falls es jemanden interessiert:

Delphi-Quelltext
1:
2:
3:
4:
function GetParentDirectory(Path: String): String;
begin
     result := ExpandFileName(Path + '\..')
end;

Damit prüfen, ob das Parent Directory dasselbe ist wie das Ausgangsverzeichnis. :)

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt