Vous n'êtes pas identifié.
Je voulais savoir si quelqu'un avait une fonction "prete a l'emploi" qui rechercherait un fichier sur tous les lecteurs, l'ouvrirait et renverrait son file descriptor.
Pour l'instant je fais :
int OpenFile (uchar *file) { struct find_t ffblk; unsigned i,maxdrives=1; for(i=1 ; i<=maxdrives && _dos_findfirst(file,FA_NORMAL,&ffblk)!=0; i++) _dos_setdrive(i,&maxdrives); int hfile = open(file, O_RDONLY | O_BINARY); return hfile; }
Voilou, ca fonctionne chez moi, mais si y'a des dossiers ou des lecteurs vides, ca marque erreur de lecture sur lecteur LETTRE:
Donc c'est pas genial. De plus, les fonctions _dos doivent prendre pas mal de place...
Merci.
Hors ligne
C'est à peu près comme ca que je procède aussi...
je fais une recherche de tous les fichiers d'un certain type (les .SMP, attention au copyright ) dans tous les lecteurs avec les fonctions findfirst et findnext et je stocke leur nom dans un tab.
Ensuite si je veux en ouvrir un j'envoie son nom à une fonction qui va tenter de l'ouvrir dans chaque lecteur jusqu'a ce qu'il y parvienne, et qui me renvoie son "descriptor"...
En gros ca donne ca:
void map_choose(char* file) { // affiche une liste des maps disponibles // permet de choisir la map // et renvoie une chaine 'file' avec le nom de la map choisie // la chaine est vide si aucun smp n'est a charger ==> on quitte. char chemin[]="L:\*.SMP", tab_noms[10][15], tab_lect[10]; int done; u_char compteur=0,choix=0,key=0; struct ffblk ff; /* recherche de tous les smp présents */ for (; chemin[0]<='Q' && compteur<10 ; chemin[0]++) { done=findfirst(chemin,&ff,0); while(!done && compteur<10) { // enregistre le nom et le lecteur contenant du fichier sprintf(tab_noms[compteur],ff.ff_name); tab_lect[compteur]=chemin[0]; compteur++; done=findnext(&ff); } } ...
(la suite de la fonction vous l'aurez pas tt de suite lol)
Et pour ouvrir:
FILE* open_file(char* nom) { char source[20]="L:\"; FILE* fichier=NULL; // concaténation des chaines 'source' et 'chemin' for (char i=0; nom[i]!='';i++) source[3+i]=nom[i]; source[3+i]=''; for (; source[0]<='Q' && fichier==NULL ; source[0]++) fichier=fopen(source,"rb"); return fichier; }
Voila y'a sans doute mieux mais ca marche tres bien chez moi... (sauf que les dossiers ne sont pas encore supportés, mais ca risque de venir )
Pour éviter les plantages lorsqu'on fait une recherche dans un lecteur vide, il faut bricoler un peu avec les gestionnaires d'erreurs etc...
Je ne me souviens plus exactement de la syntaxe pour le C (voir les sources de dirxplor, merci superna ), mais sinon pour le C++ ca donne ca:
int error_handler(int a,int b,int c,int d) { d=a+b+c+d; // ca sert franchement a rien, mais au moins j'ai pas 4 warnings a la compil! :p hardresume(_HARDERR_FAIL); return 0; } int (*handler)(int,int,int,int)=error_handler; //et au debut du main() on met: harderr(handler);
Voila, maintenant si qqn a pondu des fonctions en asm ou quoi, ca m'intéresse aussi... :P
Hors ligne
" d=a+b+c+d; // ca sert franchement a rien, mais au moins j'ai pas 4 warnings a la compil! "
tiens un gars qui comme moi se prend plus la tete avec les warning du genre
Hors ligne
Merci pour l'aide... Je pense que je prendre la partie qui gere l'erreur...
Hors ligne
regarde DirXplor encore une fois comme ça tu gerera les dossiers...
c les fonctions Dirent.h universelles (enfin Dos,Unix..)
Hors ligne