Soubor je již otevřený - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:



Delphi

Soubor je již otevřený

21. ledna 2002, 00.00 | Zajímá vás, jak v Delphi zjistit, zda nějaký soubor je otevřen jiným procesem. A nemusí být otevřen jen pro zápis, ale také pro čtení.

Zjištění zda se souborem pracuje již nějaký jiný proces, může být zvláště výhodné, pokud se může v jeden okamžik vyskytovat v paměti daný proces několikrát. A nemusí to být jen tento případ, ale také např. obsluhuje-li soubor normálně jiný proces a my ho chceme jen z nějakého důvodu načíst, pozměnit či smazat.

Pokud použijeme klasickou cestu tj. budeme předpokládat, že daný soubor je vždy připravený pouze pro nás, může se stát, že program občas vyhodí nějakou chybovou hlášku. Ta se dá odstranit např. tím že si odchytíme IOResult. Ale v ničem jiném nám to nepomůže.

Mohlo by to například vypadat takto:

var F: file of Byte;
begin
     AssignFile(F, 'test.dat');
{$I-}
     Reset(F);
{$I+}
     if IOResult = 0 then begin
          MessageDlg('File opened', mtInformation, [mbOk], 0);
          CloseFile(F);
     end else MessageDlg('File access error', mtWarning, [mbOk], 0);
end;

Tento způsob nám zajistí pouze to, že daný soubor není otevřen někým jiným pro zápis a tudíž ho můžeme číst my ale také někdo jiný. Pokud by jsme ho chtěli smazat pravděpodobně vznikne výjimka, čte-li ho ještě někdo jiný.

Předcházející způsob, však ještě nebere v úvahu jednu věc. A to, že já daný soubor vůbec nemusím chtít otevřít. Příklad: je-li spuštěný nějaký proces, může běžet i na jiném PC, takže v seznamu běžících procesů na lokálním počítači bych ho nenašel, a vím-li, že např. po celou dobu svého běhu má otevřený log soubor či jakýkoliv jiný soubor, můžu na základě této informace odvodit, že daný proces je aktivní.

Lze to vyřešit jednouchou funkcí, kterou si zjistíme, zda má daný soubor někdo otevřený jak pro zápis, tak pro čtení. Mohlo by to reálně vypadat takto:

function isFileInUse(const fileName: String): boolean;
var HFileRes : HFILE;
begin
     Result:= false;
     if not FileExists(fileName) then exit;
     HFileRes:= CreateFile(pchar(fileName), GENERIC_READ or GENERIC_WRITE,0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
     Result:= (HFileRes = INVALID_HANDLE_VALUE);
     if not Result then CloseHandle(HFileRes);
end; // isFileInUse

Tento způsob by měl správně zjistit, zda je daný soubor otevřen a to i pro čtení.

Můžeme si ještě ukázat malinkatý prográmek, který nám ukáže, zda to opravdu funguje.

// soubor fileinuse.dpr
program fileinuse;

{$APPTYPE CONSOLE}

uses 
     SysUtils, Windows;

function isFileInUse(const fileName: String): boolean;
var HFileRes : HFILE;
begin
     Result:= false;
     if not FileExists(fileName) then exit;
     HFileRes:= CreateFile(pchar(fileName), GENERIC_READ or GENERIC_WRITE,0, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);
     Result:= (HFileRes = INVALID_HANDLE_VALUE);
     if not Result then CloseHandle(HFileRes);
end; // isFileInUse

begin
     if ParamCount <> 1 then begin
          writeln('Specify file as first parameter');
          halt(255);
     end;
     if isFileInUse(ParamStr(1)) then Writeln('File ',ParamStr(1),' is in use.')
           else writeln('File ',ParamStr(1),' is not in use.');
end.

Tento jednoduchý program je ukázkovou demonstrací, která by měla potvrdit, že daný postup je funkční. Při spuštění je nutné mu jako první a jediný parameter zadat jméno souboru, který chcete otestovat.

Mohlo by vás zmást, to že soubor otevřeného dokumentu či spuštěného programu často není brán jako otevřený. A je to správně. Na vysvětlenou, při otevírání dokumentu se obvykle dokument otevře, načte jeho obsah a uzavře. Tudíž po většinu doby editace je soubor zavřený.

Kódy zde zmíněné jsou uloženy archivu fileinuse.zip (1 kB).

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: