Autor Beitrag
AScomp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: So 20.09.09 04:25 
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:

ausblenden 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!
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 20.09.09 09:07 
Vielleicht hilft das:
NetDfsGetInfo Function
in Level ist die Info.
ausblenden 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;


msdn.microsoft.com/e...4812%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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: 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:
ausblenden 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