begin process at 2012 05 27 21:17:32
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > VÉRIFIER L'EXISTENCE D'UN FICHIER (SOUS WINDOWS(32/64) EXCLUSIVEMENT !!! C'EST PAS PORTABLE SOUS D'AUTRES OS !!!)

VÉRIFIER L'EXISTENCE D'UN FICHIER (SOUS WINDOWS(32/64) EXCLUSIVEMENT !!! C'EST PAS PORTABLE SOUS D'AUTRES OS !!!)


 Information sur la source

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichiers / Disque Classé sous :fichier, file, exist, win, windows Niveau :Débutant Date de création :05/08/2001 Date de mise à jour :18/05/2007 02:12:04 Vu :15 374

Auteur : NitRic

Ecrire un message privé
Site perso
Commentaire sur cette source (22)
Ajouter un commentaire et/ou une note

 Description

*** Spécifique à Windows(32/64 bits) ***

Petit bout de code pour vérifier l'existance d'un fichier, rien de bien compliqué ...

Source

  • #define WIN32_LEAN_AND_MEAN
  • #include <windows.h>
  • #include <stdio.h>
  • //
  • // pour une version unicode
  • // changez simplement « char » par « wchar_t »
  • // et « GetFileAttributesA() » par « GetFileAttributesW() »
  • //
  • // vous pouvez aussi le faire à la Windows, deux fonctions
  • // int fileExistsA(const char* ...)
  • // int fileExistsW(const wchar_t* ...)
  • // et puis définir une macro fileExists sur fileExistsA ou fileExistsW
  • // en testant la macro UNICODE(si elle est définie alors W sinon A)
  • //
  • // ou encore y aller avec les TCHAR
  • // vous avez le choix ...
  • //
  • int fileExists(const char* fileName)
  • {
  • return (0 <= (INT_PTR)GetFileAttributesA(fileName));
  • }
  • int main()
  • {
  • printf("`c:\\autoexec.bat` existe?: %s\n", fileExists("c:\\autoexec.bat") ? "oui" : "non");
  • return 0;
  • }
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>


//
// pour une version unicode
// changez simplement « char » par « wchar_t »
// et « GetFileAttributesA() » par « GetFileAttributesW() »
//
// vous pouvez aussi le faire à la Windows, deux fonctions
// int fileExistsA(const char* ...)
// int fileExistsW(const wchar_t* ...)
// et puis définir une macro fileExists sur fileExistsA ou fileExistsW
// en testant la macro UNICODE(si elle est définie alors W sinon A)
//
// ou encore y aller avec les TCHAR
// vous avez le choix ...
//
int fileExists(const char* fileName)
{
    return (0 <= (INT_PTR)GetFileAttributesA(fileName));
}

int main()
{

  printf("`c:\\autoexec.bat` existe?: %s\n", fileExists("c:\\autoexec.bat") ? "oui" : "non");
  return 0;

}

 Conclusion

En cas de problèmes ou autres, laissez moi un message!
Si vous voulez me niaiser en me disant que c'est pas portable alors passer votre chemin maintenant !


 Historique

08 mars 2005 00:17:01 :
Plus fonctionnel
11 novembre 2006 02:17:33 :
suivant la remarque de BruNews => fonctionnel sous Windows 32/64 bits
18 mai 2007 02:12:04 :
ajout des mots clés( Vous aussi, mettez vos sources à jour !!! Ajoutez les mots clés !!! )

 Sources du même auteur

TRONQUER UN FICHIER(C - WINDOWS)
COMMENT CALCULER LE TEMP D'EXÉCUTION DE CERTAINES FONCTIONS ...
Source avec Zip VSTACK ( EFFET DE PILE ) / TEMPLATE
Source avec Zip NENGINE ( MOTEUR DE RECHERCHE POUR FICHIER ) (UPDATE)
Source avec Zip NLIST ( TEMPLATE )

 Sources de la même categorie

COMPTER LE NOMBRE DE PAGES D'UN FICHIER PDF par Renfield
Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip Source avec une capture GETIONNAIRE D'UNE BIBLIOTHÉQUE EN C par benzarabel
FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec Zip Source avec une capture UN GESTIONNAIRE DU FICHIER par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip EDITEUR HEXADÉCIMAL par dmp32
TRONQUER UN FICHIER(C - WINDOWS) par NitRic
Source avec Zip NENGINE ( MOTEUR DE RECHERCHE POUR FICHIER ) (UPDATE) par NitRic
Source avec Zip GETOPENFILENAME & GETSAVEFILENAME, ... par NitRic

Commentaires et avis

Commentaire de foxugly le 31/07/2004 06:03:42

ya pas une fonction dans l'API qui fait ça ?

Commentaire de magic_Nono le 14/04/2005 16:40:50

quelle différence avec

bool BFichier::existe(const char * nomFic)
{
return _access(nomFic,0)!=-1;
}

??

portabilité, rapidité??

++
Nono.

Commentaire de BruNews le 14/04/2005 18:32:39 administrateur CS

Portabilité ??? évacuons de suite, c'est spécialisé Windows, sera portable sur Windows et basta.

Il est clair que si tu utilises des couches d'interprétation, ce ne sera jamais aussi direct que l'appel direct API, ni en taille de code ni en vitesse.
Pour ne rien masquer, faisons exemple en sautant le CRT:

#include <windows.h>

int __stdcall FileExists(char *fname)
{
  return (GetFileAttributes(fname) != 0xFFFFFFFF);
}

// ceci sert aux 3 essais

#pragma comment(linker, "/entry:myWinMain")
int WINAPI myWinMain()
{
  MessageBox(0, FileExists("C:\\truc.txt") ? "OUI": "NON", "A", 0);
  ExitProcess(0);
}

Exe fait 2.5 Ko, semble optimal en taille.
ASM résultant:
_FileExists@4 PROC NEAR ; _fname$ = eax
  push eax
  call DWORD PTR __imp__GetFileAttributesA@4
  xor ecx, ecx
  cmp eax, -1
  setne cl
  mov eax, ecx
  ret 0
_FileExists@4 ENDP
C'est impec et aucun param, à noter (comme les 2 autres qui vont suivre) que le compilo va 'inliner' tout cela.
2eme essai, on peut forcer la suppression de la constante -1 en faisant  le 'TEST' seulement sur EAX, devrait gagner 1 octet (pas le temps de mesurer).
int __stdcall FileExists(char *fname)
{
  return (0 <= (long) GetFileAttributes(fname));
}
Exe même taille, 'TEST' seul sur EAX:
_FileExists@4 PROC NEAR ; _fname$ = eax
  push eax
  call DWORD PTR __imp__GetFileAttributesA@4
  xor ecx, ecx
  test eax, eax
  setge cl
  mov eax, ecx
  ret 0
_FileExists@4 ENDP

3eme essai, les choses se gâtent:
#include <io.h> // devient obligatoire

int __stdcall FileExists(char *fname)
{
  return (_access(fname, 0) != -1);
}

ASM résultant:
_FileExists@4 PROC NEAR ; _fname$ = eax
  push 0
  push eax
  call __access
  xor ecx, ecx
  add esp, 8
  cmp eax, -1
  setne cl
  mov eax, ecx
  ret 0
_FileExists@4 ENDP

Exe fait 7 Ko !!! la fonction a 2 PUSH au lieu de 1 et une remontée de ESP, voila qui occupera nos processeurs.
Il est aussi à noter que _access appelle GetFileAttributes en interne, vérifiable en regardant les dépendances de l'EXE grace à la suppression du CRT.
Résultat des courses, si on écrit pour Windows on ne met rien entre lui et nous et on est gagnant à tout coup.

ciao...

Commentaire de BruNews le 14/04/2005 18:36:50 administrateur CS

Excusez petite erreur d'inattention, avec GetFileAttributes c'es 2 Ko que fait exe et non 2.5.

Commentaire de NitRic le 15/04/2005 03:59:42

4 ans pour obtenir des commentaires sur mon exemple, et bien =P

Merci pour toutes ces précisions(commentaires) :}



~(.:: NitRic ::.)~

Commentaire de magic_Nono le 15/04/2005 08:59:28

merci bcp BruNews pr ces lumieres...
C'est sans appel....

Nono.

NitRic> tu vois, il ne faut js désespérer, des choses ressortent parfois de cette <cathédrale Del Bazard> ;)

Commentaire de magic_Nono le 15/04/2005 15:45:34

//Si l'on veut la mm chose fonctionnant sur les différents systemes, seriez vous d'accord avec ceci:



bool __stdcall BFichier::existe(const char * nomFic)
{
/// -------------------------------------------------------------------------------
/// ---------------- BFichier::existe(const char* nomFic) -> bool  ----------------
/// -------------------------------------------------------------------------------
/// -----  Objectif : verifier si le fichier existe
/// -----  PreCond : nomFic!="" && nomFic!=NULL
/// -----  PostCond : /
/// -------------------------------------------------------------------------------
/// -----  const char* nomFic : nom du fichier
/// ---------------------------------------------------------------------------------
/// -----  retour (bool) : existance fichier
/// -------------------------------------------------------------------------------
/// -----  Var Muettes (cf.partie préc) (1) : nomFic
/// -----  Var Internes à la fonction (2) : existe ,fichier
/// -----  Var In  (1) : nomFic

#ifdef BUNIX
bool existe=false;
FILE*fichier=fopen(nomFic,"r");
existe=(NULL!=fichier);
/// Algo : SI TODO
if(existe)
/// Algo : TODO
fclose(fichier);
return existe;

#else /* BUNIX */

return( 0xffffffffu != GetFileAttributes( nomFic ) );
/* équivalent
FileExists@4 PROC NEAR ; _fname$ = eax
  push eax
  call DWORD PTR __imp__GetFileAttributesA@4
  xor ecx, ecx
  test eax, eax
  setge cl
  mov eax, ecx
  ret 0
_FileExists@4 ENDP
*/
#endif /* BUNIX */

}


//(cette fonction étant en static dans une classe de lib)

Commentaire de magic_Nono le 15/04/2005 15:55:33

oubliez les " /// Algo : TODO" du code précédent,
j'avais oublié de décoché l'option dans MétaProg et ai posté sans relire une derniere fois

dslé

Commentaire de BruNews le 15/04/2005 16:03:23 administrateur CS

ben faudrait voir avec un expert unix si on peut ouvrir un fichier en mode exclusif parce que si oui (comme sous Windows) on ne teste pas la présence d'un fichier par le fait qu'on puisse l'ouvrir. Pourrait répondre non alors que le fichier existe bien.

Commentaire de magic_Nono le 15/04/2005 18:04:45

a ui, et idem pr les histoire de droits....

Commentaire de magic_Nono le 15/04/2005 18:31:50

non, CT pas sérieux, en plus j'ai fait ça il y a lgt,
il y a un moyen de connaitre l'arbo et les attrb des fichiers sans les ouvrir

faudra retrouver ça...

Commentaire de turnerom le 09/11/2006 10:48:21

Non mais sérieux quoi, voici comment tester l'existance d'un fichier de manière simple et portable en C++:

#include <iostream>
#include <fstream>

using namespace std;

bool exist(const string file_name)
{
    ifstream file(file_name.c_str(), ios::in);

    if (!file) return false;

    file.close();
    return true;
}

Commentaire de magic_Nono le 09/11/2006 14:43:18

ouvre ce même fichier en écriture en parallele...
et lance ton test.

ton avis turnerom?

Commentaire de turnerom le 09/11/2006 15:00:34

Mon avis sur quoi ?

Commentaire de BruNews le 09/11/2006 18:10:54 administrateur CS

50 fois qu'on répète qu'un fichier peut etre ouvert en exclusif avant par un autre processus, auquel cas ton truc répond nimporte quoi.
On ne traite jamais l'existence par l'ouverture, peut tres bien exister mais ne pas etre dispo.

Si on ne devait faire que du portable, on serait encore en console (et encore), évitez donc ces ritournelles stériles. On dev au mieux ^pour chaque systeme cible et là on a une chance de faire un truc performant, pas une daube pour tous.

Commentaire de turnerom le 09/11/2006 19:06:20

BruNews -> 50 fois qu'on répète qu'un fichier peut etre ouvert en exclusif avant par un autre processus, auquel cas ton truc répond nimporte quoi.
On ne traite jamais l'existence par l'ouverture, peut tres bien exister mais ne pas etre dispo.

--> Oui mais si tu teste l'existance d'un fichier, en général c'est au moins pour le lire, or si ma méthode renvoie faux c'est que tu n'a pas acces au fichier. Si le fichier existe mais qu'il est ouvert de facon exclusive par un autre processus, et que ma fonction renvoyée 'true' tu croirais que tu peux l'ouvrir pour lire dedans or cela ferait certainement une "seg fault" lorsque tu essayerais.


BruNews -> Si on ne devait faire que du portable, on serait encore en console (et encore), évitez donc ces ritournelles stériles. On dev au mieux pour chaque systeme cible et là on a une chance de faire un truc performant, pas une daube pour tous.

--> C'est totalement faux, le C/C++ est portable, c'est à dire qu'un même code est censé compiler et avoir le même comportement sous n'importe quelle plateforme (ce qui est le cas, y'a pas que visual dans la vie !!!). Quand à faire une interface graphique, y'a QT et wxwidget pour ne citer qu'eux qui te permettent d'avoir une belle interface graphique portable. Heureusement que tu n'a pas écrit VLC (par exemple) car à t'écouter tu aurait réécrit l'intégalité du code pour le porter sous Linux / Mac et autres ...

Tout (BON) code devrait (doit) pouvoir compiler indéferemment de la plateforme.

Commentaire de racpp le 09/11/2006 22:08:46 administrateur CS

turneron >> Brunews a raison. Il n'a pas dit que le C/C++ n'est pas portable. Toi aussi tu as raison. Mais ce que veux dire BruNews c'est que la portabilité se fait toujours au détriment de la qualité de l'application. On a certes un programme qui tournera sur toutes les plateformes, mais ce sera moins bien que s'il était conçu pour une seule plateforme. Chaque OS a ses propres spécificités. Les librairies assurant la compatibilité empêchent le programme de communiquer directement avec le système d'où la perte de performance. Cela empêche également le codeur de bien comprendre le fonctionnement du système. La compréhension du fonctionnement du système permet de bien optimiser le code et mieux maitriser le comportement de l'application.

Commentaire de NitRic le 11/11/2006 01:50:35


la raison que tu invoques est ridicule ... si on veut savoir si on peut ouvrir un fichier pour le lire on fait pas un « fileExists() » dessus, on l'ouvre en « mode lecture » et puis on test ensuite, mon exemple c'est simplement pour tester l'existance d'un fichier, pour savoir si le fichier X existe ou non, pas pour savoir si on peut le lire, écrire dedans, etc. d'où le nom de la fonction :: fileExists()

*** hors sujet ***

pour ton histoire de portabilité, c'est évident que d'utiliser des librairies déjà développés/testés/etc. ca aide beaucoup mais ca n'empêche pas qu'on puisse quand même ajouter du code spécifique à un OS quelconque, regardes les softs(portables) open source, il y en a beaucoup qui le font, ils ne se basent pas toujours sur des librairies telles que qt/gtk/wx/etc. pour développer leurs softs(fonctionnalités spécifiques, ...), ils ont aussi des parties spécifiques à des OS X, Y et Z ... alors oui, les librairies du genre à qt/gtk/wx/etc. sont utiles mais elles ne contiennent pas toujours tout ce qu'il faut pour développer nos applications(et là je parle pas d'une simple calculatrice hein ...), surtout quand on veut quelque chose de performant, ce genre de librairie n'est pas souvent adapté pour ca ...

c'est un peu comme les distro. linux, les builds x86 qui ne sont pas optimisés pour chaque PC(intel et compatible) mais c'est plutôt un build générique, les librairies telles que qt/... c'est pas mal la même chose ...

en passant, la portabilité d'un OS à un autre n'est pas une « obligation », loin de là, pour un développeur qui développe uniquement sous Windows(comme moi) par exemple, ca lui servirait à quoi? moi personnellement j'en vois pas l'interet et j'en ai pas besoin même si, oui oui, j'ai Linux sur deux de mes postes ...

*** hors sujet ***

il faudrait aussi penser à regarder le titre de l'exemple ... à moins d'avis contraires, j'ai bien mis « WIN » dans le titre, non? et on voit aussi « #include <windows.h> dans le code je crois, mais je suis pas certain, faudrait vérifier :-/
j'ai aussi mis « Linux » ou « Portable » ou autre dans le titre/code/... ??? quelqu'un pourrait confirmer s'il vous plait?

=_=

Commentaire de BruNews le 11/11/2006 01:58:33 administrateur CS

return (0 <= (INT_PTR) GetFileAttributes( fname ) );
évite les constantes ce qui permet portabilité vers x64.

Commentaire de NitRic le 11/11/2006 02:03:05

ca m'érite une mise à jour, merci pour la remarque

Commentaire de chadilou le 02/01/2007 03:16:58

svp j'aimerais savoir comment verifier l'existance d'un fichier .txt en c++

Commentaire de magic_Nono le 04/01/2007 15:02:21

si on devait faire une nouvelle fonction pour chaque extension, on aurais pas fini de coder...

on a déjà répondu à la question ici en détaillant différentes méthodes, leurs avantages & inconvénients.

Bonne prog à tous
et que vos voeux se réalisent pr cette nouvelle année.
Magicalement
Nono.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Problème avec traitement de fichier (cplusplus !) [ par Sianrin ] Voila, j'explique mon problème. Pour voir un peu comment les accès au fichiers se géraient en cplusplus, je me suis mis en tête de faire un programme Remplacer la copie de fichier de Windows [ par MangaII ] Salut !Quelqu'un sorai-t-il comment on pe remplacer la fonction de copie de fichier sous Windows par un programme maison !Mon but est d'optimiser la c Remplacer la fonction de copie de fichier sous Windows [ par MangaII ] Salut !Quelqu'un sorai-t-il comment on pe remplacer la fonction de copie de fichier sous Windows par un programme maison !Mon but est d'optimiser la c Petit probleme de code en C sur Linux !! [ par UncleShu ] Je voudrais créer un fichier dans le réperoire personnel d'un utilisateur mais mon code ne marche pas !!#include &lt;stdio.h&gt; #include &lt;stdlib.h Ouvrir un fichier à la "Windows" [ par CyberP ] Comment afficher la boite de dialogue de choix de fichier classique de windows ? (ex : dans Word, si l'on fait fichier -&gt; ouvrir, une boite de dial ouverture de fichier avec les MFC [ par steph76 ] Bonjourvoila je programme une application qui ha beusoin d'ouvrir 1 fichier via httpJ'ai donc fait le code suivantCStdioFile *file;CInternetSession IS Enregistrer en HEXA un texte avec gcc !! [ par UncleShu ] /* * Ce programme affiche le fichier en HEXADECIMAL et se copie lui-même avec * une autre exetenstion (.txt). Moi je voudrais qui affiche le fichier * Programmer sous win n'est pas si evident... [ par DJeS ] Bon apres le mode consol, sous DOS, on a tendance en general a passer sous windows pour programmer mais j'avoue que j'ai qq problemes notament pour la Comment ouvrir la fenetre Windows "Ouvrir Fichier" en C++ ? [ par Pol Hochon ] Salut !J'ai un problème pour un projet de C++.J'aimerais bien connaitre l'instruction en C++ quipermet d'ouvrir la boite de dialogue Windows "Ouvrir" Pb de gestion de fichier avec fstream [ par Bub325 ] Salut,J'ai deux problème distinct avec fstream, Le premier est que lorsque j'arrive à la fin d'un fichier, je ne peut plus revenir plus haut dans ce d


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,640 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales