Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prüfen, ob eine Datei geöffnet werden kann (https://www.delphipraxis.net/32072-pruefen-ob-eine-datei-geoeffnet-werden-kann.html)

gkoeder 18. Okt 2004 12:53


Prüfen, ob eine Datei geöffnet werden kann
 
Hallo,

hab' eine eigendlich recht einfache Frage: Wie kann man prüfen, ob eine Datei zum lesen geöffnet werden kann (z.B. also von keinem anderen Programm gerade geöffnet ist)?
Ich hab's bisher mit folgender Funktion probiert, allerdings wird z.B. ein gerade geöffnetes Excel-File problemlos durchgereicht (was dann später zu nem I/O Error 32 führt):

Delphi-Quellcode:
function CanOpenFile(const aName: string; var ReadOnly: Boolean): Boolean;
var
  HFileRes: hFILE;
  fStream: tFileStream;
begin
  Result  := False;
  ReadOnly := True;
  HFileRes := 0;
  if FileExists(aName) = True
  then
    begin
      try
        fStream := TFileStream.Create(aName, fmOpenRead OR fmShareDenyNone);
        try
          Result := true;
          Try
            HFileRes := CreateFile(pchar(aName), GENERIC_READ or GENERIC_WRITE, 0 , nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
            ReadOnly := (HFileRes = INVALID_HANDLE_VALUE);
          Finally
            If HFileRes <> 0 then CloseHandle(HFileRes);
          End;
        finally
          fStream.Free;
        end;
      except
        Result := false;
      end;
    end;
end;
Thanks,
Gerald

Mario 19. Okt 2004 09:04

Re: Prüfen, ob eine Datei geöffnet werden kann
 
Ich vermute, dass Deine Routine schon korrekt ist. Jedoch arbeitet Office mit temporären Dateien, die parallel zu Deiner Datei angelegt werden, vermutlich darfst Du also die geöffneten Office Files trotzdem noch öffnen.

Probiere es mal so:
Delphi-Quellcode:
Function TryOpen(FileName: String):Boolean;
var aFile: File;
begin
  Result := False;
  AssignFile(aFile, FileName);
  Try
    Try
     Reset(aFile);
    Finally
     CloseFile(aFile);
    End;
    Result := True;
  Except
  End;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 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-2025 by Thomas Breitkreuz