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

cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018 - 14 août 2010 à 18:07
cs_Gerard Messages postés 121 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

4 réponses

Utilisateur anonyme
14 août 2010 à 23:20
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 ?
0
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018
15 août 2010 à 06:53
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...
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
15 août 2010 à 13:29
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]
0
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018
15 août 2010 à 16:48
Merci!
Dire que j'ai tourné autour sans m'en apercevoir!
Ce doit être l'origine du problème!
Je corrige...
0
Rejoignez-nous