![]() |
Ordner verstecken
Hallo,
ich verwende diese Methode um einen versteckten Ordner zu erstellen:
Delphi-Quellcode:
Leider ist der Ordner der erstellt wird alles andere als versteckt.. die if-Bedingung wird aber auf jedenfall erfüllt und das SetFileAttributes auch ausgeführt.
procedure CreateHiddenFolder(APath: WideString);
begin if not DirectoryExists(APath) and ForceDirectories(APath)then begin SetFileAttributes(PAnsiChar(APath),FILE_ATTRIBUTE_HIDDEN); end; end; Die Methode hab ich von hier: ![]() Hat jemand ne Idee? Ich arbeite hier mit D2005 (noch)unter Vista, sollte aber ja eig keine Rolle spielen oder? Hat es was mit der Typumwandlung von WideChar in PAnsiChar zu tun? Oft isses ja was ganz banales was man übersieht :gruebel: |
Re: Ordner verstecken
Dieses setzt nur das Hidden(Versteckt)-Attribut der Dateien/Verzeichnisse,
aber wenn der Explorer so eingestellt ist, daß er versteckte Dateien anzeigt, dann bringt das nicht viel (standardmäßig ist er aber nicht so eingestellt) und FindFirst und Co. findet eh alles. |
Re: Ordner verstecken
Ja schon klar, ist auch so eingestellt, dass versteckte Ordner und Dateien angezeigt werden.
Aber man sieht in den Eigenschaften doch trotzdem ob der Ordner das versteckt Flag hat oder nich. Bzw der Ordner ist auch so halbtransparent. Und der Ordner bekommt das Flag definitiv nicht. |
Re: Ordner verstecken
Warum fehlt wieder die halbe Fehlerbehandlung?
Zitat:
Wenn ihr euch mal angewöhnen würdet eine gescheite Fehlerbehandlung zu implementieren, dann würde sich in der Hälfte aller Fälle die Frage nach dem "warum" wahrscheinlich von selbst beantworten. aber wie soll ich das verstehen: "Aber man sieht in den Eigenschaften doch trotzdem ob der Ordner das versteckt Flag hat oder nich. Bzw der Ordner ist auch so halbtransparent." Und "Und der Ordner bekommt das Flag definitiv nicht.". Ist denn nun das Attribut Versteckt gesetzt oder nicht? |
Re: Ordner verstecken
Anderer Vorschlag:
Delphi-Quellcode:
function SetOrCreateHiddenFolder(const APath: WideString): DWORD;
begin Result := 0; if DirectoryExists(APath) or ForceDirectories(APath) then begin if not SetFileAttributes(PAnsiChar(APath),GetFileAttributes(PAnsiChar(APath)) or FILE_ATTRIBUTE_HIDDEN) then Result := GetLastError; end else Result := -1; end; |
Re: Ordner verstecken
Delphi-Quellcode:
Wenn die erste Bedingung false ergibt wird die zweite überhaupt nicht ausgeführt (sofern man die vollständige Auswertung von Statements deaktiviert hat = Standard). Besser wäre es einfach ForceDirectories auszuführen und danach überprüfen ob der Ordner existiert.
if DirectoryExists(APath) or ForceDirectories(APath) then
Delphi-Quellcode:
ForceDirectories(...);
if DirectoryExisst(...) then begin //... end; |
Re: Ordner verstecken
Zitat:
|
Re: Ordner verstecken
Zitat:
|
Re: Ordner verstecken
Ich bin ein wenig erstaunt, wieso das noch niemandem aufgefallen ist:
Delphi-Quellcode:
Dort wird ein WideString übergeben und direkt zu einem AnsiString Pointer gecasted. Das ergibt einen AnsiString der nur den ersten Buchstaben des Pfads enthält (weil das zweite Byte bereits 0 ist - Unicode sei Dank). Also entweder Du übergibst dort direkt einen AnsiString, rufst die Wide Funktion auf oder aber erweiterst Deinen Cast auf PAnsiChar(AnsiString(APath)).
procedure CreateHiddenFolder(APath: WideString);
begin if not DirectoryExists(APath) and ForceDirectories(APath)then begin SetFileAttributes(PAnsiChar(APath),FILE_ATTRIBUTE_HIDDEN); end; end; Hättest Du wie von Luckie bereits kritisiet übrigens direkt Fehlerbehandlung eingebaut, wäre Dir der GetLastError Wert für "File not found" sicher selbst aufgefallen. |
Re: Ordner verstecken
Zitat:
- Fehlerprüfungen und dann vorallem KEINE Vermischung von Ansi/Unicode :!: APath = Unicode DirectoryExists(APath = compilerabhängig + Unicode ForceDirectories(APath = compilerabhängig + Unicode SetFileAttributes(PAnsiChar = compilerabhängig + Ansi PAnsiChar(APath) = Ansi + Unicode (hier sollte aber der Compiler auch meckern) kein Wunder, daß nichts funktioniert :warn:
Delphi-Quellcode:
procedure CreateHiddenFolder(APath: String);
begin if not DirectoryExists(APath) and ForceDirectories(APath)then begin SetFileAttributes(PChar(APath), FILE_ATTRIBUTE_HIDDEN); end; end;
Delphi-Quellcode:
procedure CreateHiddenFolder(APath: AnsiString);
begin // hier ist eine Ansi-Version nötig, aber Unicode ginge auch nocht if not DirectoryExists(APath) and ForceDirectories(APath) then // <<<<< begin SetFileAttributesA(PAnsiChar(APath), FILE_ATTRIBUTE_HIDDEN); end; end;
Delphi-Quellcode:
procedure CreateHiddenFolder(APath: WideString);
begin // hier ist eine Unicode-Version nötig if not DirectoryExists(APath) and ForceDirectories(APath) then // <<<<< begin SetFileAttributesW(PWideChar(APath), FILE_ATTRIBUTE_HIDDEN); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 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 by Thomas Breitkreuz