Impossible accéder au fichier ...utilisé par un autre processus

Messages postés
123
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018
- - Dernière réponse : cs_Gerard
Messages postés
123
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018
- 15 août 2010 à 16:48
Bonjour,
J'ai développé un serveur sur lequel les gens viennent jouer au bridge. De temps à autre, le serveur crache une erreur 'Le processus ne peut acc"ser au fichier car ce fichier est utilisé par un autre processus'.
j'ai essayé pas mal d'options de lecture mais en vain jusqu'alors.
Quelle est l'option qui permet à un fichier d'être accédé en lecture par plusieurs processus ou alors comment faire pour contourner le problème?
Merci
Afficher la suite 

4 réponses

0
Merci
Salut Gégé : Avec si peu d'informations, il est difficile de répondre à ta question.

*Quel fichier ouvres tu ?
*Comment ouvres tu ton fichier (Stream, block) ?
*Pourquoi utilises tu un fichier annexe ?
*Ton fichier est il utilisé par autre chose que ton serveur ?


Bref il y a des tonnes de questions que l'on pourrait te poser, donc des précisions ou un ptit bout de code seraient les bienvenus ?
Commenter la réponse de Utilisateur anonyme
Messages postés
123
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018
0
Merci
Bon effectivement j'étais resté un peu vague car cela arrive dans plusieurs situations, la plus gênante étant quand ils veulent s'inscrire.Pour cela leur navigateur télécharge le programme inscription.exe qui est renvoyé au navigateur par une procédure assez générale:
Procedure EnvoiFichierType(Fichier,Contenu: String; PriseClient: TidContext);
VAR fs: TFileStream;
BEGIN
  if FileExists(Fichier) then
  Begin
  try
    Fs := TFileStream.Create(Fichier,fmOpenRead,fmShareDenyNone); //Créer le flux
    priseClient.Connection.Socket.WriteLn('HTTP/1.1 200 OK');
    priseClient.Connection.Socket.WriteLn('Content-type: '+Contenu);
    priseClient.Connection.Socket.WriteLn('Content-length: '+IntToStr(fs.Size));
    priseClient.Connection.Socket.WriteLn('');
     try
        try
          PriseClient.Connection.Socket.Write(Fs); //Ecrit le flux
        except
          MessageDlg('Erreur pendant l''envoi du fichier.', mtError, [mbOK], 0);
        end;
     finally
        FreeAndNil(Fs); //Libérer le flux
     end;
  finally
  end;
end;
END;

Comme tu peux voir j'utilise un TfileStream en lecture avec un fmShareDenyNone dont il est précisé dans l'aide que le fichier peut être accédé par plusieurs applications...
Il n'y a pas d'autres applications qui appellent la lecture de ce fichier et le très faible taux d'inscription (2 ou trois par jour au mieux) rend peu probable une collision, qui de surcroit ne peut se produire car il me semble avoir compris que le thread ne peut s'exécuter que lorsque son usage précédent est terminé?
Comme ce n'est pas mon message d'erreur qui est déclenché, je suppose que c'est à la création du flux que cela plante (quand cela plante car c'est aléatoire).
Tu peuconstater que j'ai pas mal tourné autour de la question avec tous les try qui y figurent.
Il me vient une question à laquelle je n'avais pas encore prêté attention:
Est-ce que le fileexists pourrait entraîner ce problème s'il "prend en main" le fichier et qu'il ne soit pas relâché au moment de la création du flux? Il va falloir que je teste...
Commenter la réponse de cs_Gerard
Messages postés
4233
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 juillet 2019
32
0
Merci
Salut,

avant d'essayer de comprendre de quoi souffre ton code il y a déjà ceci qui n'est pas bon :
    Fs := TFileStream.Create(Fichier,fmOpenRead,fmShareDenyNone); //Créer le flux


ça devrait être :
    Fs := TFileStream.Create(Fichier,fmOpenRead or fmShareDenyNone); //Créer le flux



[hr]@+Cirec
[hr]
Commenter la réponse de Cirec
Messages postés
123
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018
0
Merci
Merci!
Dire que j'ai tourné autour sans m'en apercevoir!
Ce doit être l'origine du problème!
Je corrige...
Commenter la réponse de cs_Gerard