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);
Était-ce utile?

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')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top