Manipulation de fichier

Résolu/Fermé
Utilisateur anonyme - 14 janv. 2009 à 14:58
 Utilisateur anonyme - 14 janv. 2009 à 19:42
salut à tous,
est ce que quelqu'1 pourrait me dire si on peut savoir qu'un fichier est ouvert ou pas en C
merci
A voir également:

10 réponses

XxTitxX Messages postés 1176 Date d'inscription samedi 24 mai 2008 Statut Membre Dernière intervention 30 août 2012 246
14 janv. 2009 à 15:07
Bonjour,

Pour quelqu'un qui programme en C, tu ne sais pas très bien chercher des informations !!!

Voila ce que j'ai trouvé en 5 minutes:

Salut,

Pour savoir si un fichier est ouvert par une autre application tu peux tenter une ouverture exclusive :

Ca donne qqch de ce genre :
private bool TryExclusiveOpen(string filePath, out FileStream fs)
{
try
{
fs = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
return true;
}
catch
{
fs = null;
return false;
}
}

Ce type de demande d'ouverture exclusive échouera même si le fichier est ouvert en accès partagé, par ce type d'ouverture par exemple :
File.Open(@"C:\test.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);

Tu sauras donc si le fichier est utilisé ou non.

Pour les applications telles que Notepad, tu ne peux pas savoir car elle ne garde pas le fichier ouvert après avoir lu son contenu :
lecture : ouverture => lecture => fermeture
enregistrement : ouverture => fermeture => fermeture

A l'inverse, des applications telles que Acrobat ( merci Mx ;-) ) gardent le fichier ouvert.

Un petit tour dans ProcessExplorer vous le montrera :-)


Source: https://codes-sources.commentcamarche.net/
1
papymucho Messages postés 140 Date d'inscription mercredi 18 juin 2008 Statut Membre Dernière intervention 1 novembre 2009 220
14 janv. 2009 à 15:14
Heu c'est sympa la réponse, mais tu le renvoi sur du C# là ;-)
utilise plutôt ce lien :
https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/16421-lire-et-ecrire-dans-des-fichiers
0
XxTitxX Messages postés 1176 Date d'inscription samedi 24 mai 2008 Statut Membre Dernière intervention 30 août 2012 246
14 janv. 2009 à 15:21
oups ;)
0
Utilisateur anonyme
14 janv. 2009 à 15:56
c'est pas ca le pb, voici ce que je veux faire :

fontction(const char *filename){
FILE in = fopen(filename,"r");

//ici une autre fonction utilisant le meme fichier
autre(filename);

fclose(in);
}

autre(const char* filename){
//ici le pb c'est que je veux savoir si le fichier est déja ouvert ou pas pour l'ouvrir dans le cas contraire
FILE in = fopen(fillename,"r");

//le pb ici est si le fichier a été déja ouvert je ne dois pas le fermer pour pouvoir continuer a travailler dessus
//dans la fonction appelante "fonction()"
fclose(in);
}

je dois faire un test sur le fichier pour voir s'il est ouvert
0
Un détail: fopen renvoie un pointeur de type FILE.
Sinon tu peux déclarer, par exemple dans le 'main', un pointeur de type FILE, l'initialiser à NULL et le balader de fonction en fonction; dans chaque fonction tu testeras si le pointeur est valide (si non NULL), ainsi tu sauras si le fichier est déjà ouvert. Note que si tu le fermes, il ne faudra pas oublier de remettre le pointeur à NULL.
0
Je pense avoir compris ton problème:
A plusieurs endroits dans ton programme tu utilises un fichier et tu voudrais savoir si à un moment donné le fichier est ouvert ou fermé? A moins de suivre, comme je l'ai dit ci-dessus, un pointeur sur ce fichier, ce n'est pas possible (du moins à ma connaissance et avec les fonctions classiques du C); et encore tu ne pourras pas savoir si ton fichier n'est pas ouvert par un autre processus. Sache que dans un même programme, tu peux ouvrir plusieurs fois le même fichier avec des descripteurs différents et chacun pourra écrire ou lire à sa guise dans le fichier; attention aux écritures qui ne seront peut-être pas dans l'ordre voulu (il faut donc ne pas oublier de vider les buffers).
Selon ce que tu veux faire et à moins d'avoir des milliers d'ouvertures, peut-être est-il raisonnable de fermer le fichier dès qu'on en a momentanément plus besoin. Chaque cas est particulier, il faut voir.
0
papymucho Messages postés 140 Date d'inscription mercredi 18 juin 2008 Statut Membre Dernière intervention 1 novembre 2009 220
14 janv. 2009 à 17:03
Dans le lien que je t'ai envoyé, c'est pourtant écrit noir sur blanc pour savoir si ton fichier est réellement ouvert ou non
0
XxTitxX Messages postés 1176 Date d'inscription samedi 24 mai 2008 Statut Membre Dernière intervention 30 août 2012 246
14 janv. 2009 à 17:27
Bon on va l'aider en sélectionnant juste la parti utile:

Juste après l'ouverture du fichier, il FAUT absolument vérifier si l'ouverture a réussi ou pas. Pour faire ça, c'est très simple : si le pointeur vaut NULL, l'ouverture a échoué. S'il vaut autre chose que NULL, l'ouverture a réussi.
On va donc suivre systématiquement le schéma suivant :

Code : C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18



int main(int argc, char *argv[])
{
FILE* fichier = NULL;

fichier = fopen("test.txt", "r+");

if (fichier != NULL)
{
// On peut lire et écrire dans le fichier
}
else
{
// On affiche un message d'erreur si on veut
printf("Impossible d'ouvrir le fichier test.txt");
}

return 0;
}



Faites toujours ça lorsque vous ouvrez un fichier. Si vous ne le faites pas et que le fichier n'existe pas, vous risquez un plantage du programme ensuite.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
14 janv. 2009 à 18:52
ca me semble un peut logique ton idée lupius, si j'ai bien compris tu veut dire creer une variable globale de type FILE qui contiendra l'adresse du flux lors de chaque ouverture et NULL a chaque fermeture et puis je compare selon la valeur de la variable; si c'est NULL c'est à dire que le fichier est fermé et dans le cas contraire il est ouvert.
ca peut marcher ça je crois que je vais y reflechir..

je crois comprendre l'idée de XxTitxX et papymoucho aussi si j'ai bien compris c'est de comparer le flux de fichier s'il est NULL c'est juste aussi mais le pb ici c'est que la fonction autre() resçoit en paramètre un const char* et pas un flux FILE *
0
Mais bien sûr que XxTitxX et papymoucho ont raison; lorsque l'on ouvre un fichier il faut s'assurer que tout s'est bien passé (c'est-à-dire tester si le descripteur n'est pas null).
Et tant que tu n'auras pas refermé ce descripteur il restera valide et ce sera pour toi le seul moyen de savoir si ton fichier est ouvert, car si tu veux ouvrir le fichier evec un autre descripteur, le système ne te dira pas non (c'est-à-dire qu'il ne te dira pas: Impossible, le fichier est déjà ouvert!).
0
Utilisateur anonyme
14 janv. 2009 à 18:59
le pb c'est encore compliqué avec l'utilisation d'un fichier dans une fonction récursive car j'a travaille avec les arbres il y a une vrais galère avec les fichiers il ont vraiment casser ma tête
si quelqu'un peut m'aider j'en serait très reconaisant aider moi svp
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
14 janv. 2009 à 19:01
Salut,

le pb ici c'est que la fonction autre()
C'est quoi cette fameuse fonction?!

Quand tu ouvres un flux tu auras soit un pointeur NULL qui veut dire qu'il y a un échec d'ouverture soit un pointeur de type FILE vers ton fichier.

0
Utilisateur anonyme
14 janv. 2009 à 19:12
oui je sais ça le pb c'est lorsque j'ouvre le fichier dans fonction() j'aurai à le fermer c'est normal mais lorsque j'utilise le meme fichier dans autre() "une fonction quelconque qui utilisera le meme fichier que fonction() " j'ai besoin je ne peut pas le fermer tout simplement parceque fonction() en aura besoin,

le pb en d'autre mot c'est ça:
fonction(const char *file){
in = fopen(file)

flux = fopen(file)

fclose(flux); //le pb c'est ici je ferme le fichier tandi que fonction en aura besoin après

fclose(in)
}

ou encore
fonction(const char* file){
in = fopen(file);

fonction(); //ici appel récursif à fonction()
fclose(in);
}
0
Un exemple simple:
void fichier1 (FILE* fich)
{
  fprintf (fich, "fonction 1\n");
  ...
}

void fichier2 (FILE* fich)
{
  fprintf (fich, "fonction 2\n");
  ...
}

int main (int argc, char *argv[])
{
  FILE* fichier = fopen ("test.txt", "a+");

  if (fichier == NULL)
  {
    // On affiche un message d'erreur et on termine
    printf("Impossible d'ouvrir le fichier test.txt");
    exit (1);
  }
  ...
  while (le test que tu veux)
  {
    fonction1 (fichier);
    ...
    fonction2 (fichier);
  }
  fclose (fichier);
  return 0;
}
En espérant que cela t'aidera.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
14 janv. 2009 à 19:19
Re,

Ben, fait fopen entre les fonctions.
Donc tu ouvres et tu fermes le flux quand tu as besoin de le faire.

A savoir qu'il faut choisir le bon mode d'ouverture pour ne pas écraser les données déjà existantes.
0
Utilisateur anonyme
14 janv. 2009 à 19:42
hah ouiiiii j'y avait pas pensé
c'est très sympa de votre par les ami j'en suis très reconnaissant merci
0