Entwickler-Ecke

Dateizugriff - DirectoryExists ohne Dialoge?!


FriFra - Di 08.07.03 12:38
Titel: DirectoryExists ohne Dialoge?!
Wie kann ich verhindern, dass DirectoryExists('A:\'); bei fehlender Diskette unter NT4 (unter XP, 2000 und 2003 passiert das nicht!) einen Fehlerdialog öffnet...
user defined image

Das ist besonders bei einer Serveranwendung ziemlich lästig, da man ja nicht ständig zum Server rennen kann um zu bestätigen...


CenBells - Di 08.07.03 13:05

Hallo,
hast du dir mal den kompierschalter {I+} bzw {I-} angeschaut? Wenn du die verwendest musst du nur noch explizit auf IOResult = 0 testen.

Gruß
Ken


mimi - Di 08.07.03 13:13

packe die if abfrage doch einfach in einer
try
except
end;
block rein und fertig.


FriFra - Di 08.07.03 13:15

Ich hab jetzt mal direkt unter Implementation folgendes eingefügt:

Delphi-Quelltext
1:
2:
{$I-}
{$IOCHECKS OFF}


Allerdings hat das keinerlei Auswirkungen...


FriFra - Di 08.07.03 13:16

mimi hat folgendes geschrieben:
packe die if abfrage doch einfach in einer
try
except
end;
block rein und fertig.


Nix fertig... So einfach ist es leider nicht...


mimi - Di 08.07.03 13:24

nartürlich, das dialog kommt nicht mehr:)
und das war doch das ziel oder nicht ?


AndyB - Di 08.07.03 13:25

Es geht so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function DirectoryExistsEx(const Directory: string): Boolean;
var
  ErrorMode: Cardinal;
begin
  ErrorMode := SetErrorMode(EM_FAILCRITICALERRORS);
  try
    Result := DirectoryExists(Directory);
  finally
    SetErrorMode(ErrorMode);
  end;
end;


FriFra - Di 08.07.03 13:29

mimi hat folgendes geschrieben:
nartürlich, das dialog kommt nicht mehr:)
und das war doch das ziel oder nicht ?


NEIN, der Dialog kommt noch!!!


FriFra - Di 08.07.03 13:33

@AndyB: In welcher Unit ist EM_FAILCRITICALERRORS deklariert?


mimi - Di 08.07.03 13:37

wenn man es richtig macht dürfte kein dialog kommen es sei den die funktion löst kein excepition aus. oder wie das heißt, das könnte natürlich sein.


FriFra - Di 08.07.03 13:38

mimi hat folgendes geschrieben:
wenn man es richtig macht dürfte kein dialog kommen es sei den die funktion löst kein excepition aus. oder wie das heißt, das könnte natürlich sein.


:evil: Hör endlich auf! Ich hab Dir schon mehrmals gesagt, dass es so nicht geht... DirectoryExists löst KEINE Exception aus, es kommt nur dieser blöde Dialog... Wenn es so einfach wäre, hätte ich ganz sicher nicht gefragt!


Tana´Ri - Di 08.07.03 13:45


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button1Click(Sender: TObject);

      function DirectoryExistsEx(const Directory: string): Boolean;
        var ErrorMode: Cardinal;
       begin
        ErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
        try
          Result := DirectoryExists(Directory);
        except
         SetErrorMode(ErrorMode);
        end;
      end;

begin
   DirectoryExistsEx('A:\');
end;


fehlerhaft EM_FAILCRITICALERRORS (S fehlt)
richtig -> SEM_FAILCRITICALERRORS


FriFra - Di 08.07.03 13:50

@Tana'Ri, AndyB: :D Danke! Jetzt funktioniert es.
:dance: :dance2: :beer:


Delete - Di 08.07.03 13:55

FriFra hat folgendes geschrieben:
:evil: Hör endlich auf! [...]

Warum schreist´n den armen mimi so an? Nicht, dass ich ihn unbedingt leiden kann; bei das Teutsch, wo er benutzt ... :mrgreen: ... aber er versucht doch auch bloß, dir zu helfen. btw: Meine Funktion sieht (altertümlich) so aus und funktioniert problemlos:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function DirectoryExists(const szDirName: string): boolean;
var
  tmp : string;
begin
  {$I-}
  GetDir(0,tmp); ChDir(szDirName); Result := (IoResult = 0); ChDir(tmp);
  {$I+}
end;

Du kannst auch Borlands Grundlage von "fileexists" benutzen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function fileexists(const szFilename: string): boolean;
var
  Handle   : THandle;
  FindData : TWin32FindData;
begin
  Handle := FindFirstFile(pchar(szFilename),FindData);
  Result := (Handle <> INVALID_HANDLE_VALUE);

  if(Result) then Windows.FindClose(Handle);
end;

{ ... }

if(fileexists('c:\Programme')) then ShowMessage('OK');

Getestet unter Win98. Ergebnis: klappt. :)


FriFra - Di 08.07.03 14:03

@MathiasSimmack: Auch Danke für Deine Tips ;)

...mimi habe ich angeschrien, weil ich mich drüber aufgeregt habe, das 3x das gleiche kam, obwohl das mimi es offensichtlich selbst nie getestet hat und obwohl ich schon nach dem ersten Tip gesagt hatte, das es so nicht geht...


AndyB - Di 08.07.03 16:15

Tana´Ri hat folgendes geschrieben:
fehlerhaft EM_FAILCRITICALERRORS (S fehlt)
richtig -> SEM_FAILCRITICALERRORS

Das hat man nun, vom Copy & Paste aus dem Win32SDK. :cry:


FriFra - Do 17.07.03 22:56

Leider kommt der Dialog trotz:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function DirectoryExistsEx(const Directory: string): Boolean; 
var
  ErrorMode: Cardinal; 
begin 
  ErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS); 
  try 
    Result := DirectoryExists(Directory); 
  except 
    SetErrorMode(ErrorMode); 
  end
end;


unter NT4 sporadisch (im Durchschnitt bei jedem 100. Aufruf :roll: ) noch vor :cry: ! Wie kann das sein? ...und wie kann ich das endgültig und sicher abstellen?