Vérification du fichier ouverte dans Delphi
Question
Existe-t-il un moyen de vérifier si un fichier a été ouvert par ReWrite dans Delphi?
Le code donnerait quelque chose comme ça:
AssignFile(textfile, 'somefile.txt');
if not textFile.IsOpen then
Rewrite(textFile);
La solution
Vous pouvez obtenir le filemode. (Un instant, je vais créer un exemple).
TTextRec (txt) .Mode vous donne le mode:
55216 = closed
55217 = open read
55218 = open write
fmClosed = $D7B0;
fmInput = $D7B1;
fmOutput = $D7B2;
fmInOut = $D7B3;
Recherchez TTextRec dans l'unité centrale pour plus d'informations.
Autres conseils
Essayez ceci:
function IsFileInUse(fName: string) : boolean;
var
HFileRes: HFILE;
begin
Result := False;
if not FileExists(fName) then begin
Exit;
end;
HFileRes := CreateFile(PChar(fName)
,GENERIC_READ or GENERIC_WRITE
,0
,nil
,OPEN_EXISTING
,FILE_ATTRIBUTE_NORMAL
,0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not(Result) then begin
CloseHandle(HFileRes);
end;
end;
Cela fonctionne bien:
function IsOpen(const txt:TextFile):Boolean;
const
fmTextOpenRead = 55217;
fmTextOpenWrite = 55218;
begin
Result := (TTextRec(txt).Mode = fmTextOpenRead) or (TTextRec(txt).Mode = fmTextOpenWrite)
end;
J'ai trouvé plus facile de garder une variable booléenne comme compagnon; exemple: bFileIsOpen
. Où que le fichier soit ouvert, définissez bFileIsOpen: = true
, puis, chaque fois que vous aurez besoin de savoir si le fichier est ouvert, testez simplement cette variable; exemple: if (bFileIsOpen) then Close (fichier de données);
La réponse de Joseph fonctionne parfaitement - j'ai appelé la fonction filenotopen
et modifié la ligne si
Result := (HFileRes = INVALID_HANDLE_VALUE);
à
Result := NOT (HFileRes = INVALID_HANDLE_VALUE);
J'ai également supprimé la ligne "sinon" (Résultat), puis commencer "(et la" fin ") afin qu'elle ferme TOUJOURS le descripteur ou les affectations suivantes et que les lectures donnent des erreurs
Je l'appelle maintenant comme ça
if filenotopen(filename) then
begin
assignfile(f,filename);
reset(f)
etc;
end
else
message('file open by a different program')