Un peu perdu...

Résolu
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 - 2 févr. 2006 à 17:08
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 - 3 févr. 2006 à 18:05
bjr ,
me remettant au c++ pour la enieme fois je voulais creer un petit programme permettant de lister les fichier d'un certain type alors je commence mais des les premiere ligne je suis bloqué :
comment creer un objet fichier (je resonne peut etre un peu java mais bon...) ?
j'ai trouver des choses mais rien qui ne m'aille!!

donc en gros ce que je voudrasi savoir c'est :

-comment creer un objet "file" ou "directory"?
-y appliquer des fonction permettant de le lister ?

ou alors de la doc la dessus !! je n'en ai pas trouvé

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"

22 réponses

racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
3 févr. 2006 à 02:45
Le principe du handle est pareil pour linux aussi.

A l'ouverture d'un fichier, la fonction CreateFile retourne un handle. Grâce à ce handle, on peut faire toutes les opérations

voulues sur ce fichier comme la lecture, l'écriture, la fermeture etc en appelant les fonctions adéquates.

Il existe d'autres sortes de handles comme HWND pour les fenetres, les
boutons, les statics etc. Pour manipuler un bouton, le griser,

le cacher, le déplacer etc on founit ce HWND à la fonction
adéquate. Pareil pour les autres types de handles pour les polices
(HFONT), les images

bitmap (HBITMAP) , les menus (HMENU), les ressources (HRSRC) etc.



La programmation C/C++ sous Windows en utilisant les APIs, te permet de
bien comprendre le fonctionnement du système. Cela t'aidera à bien

concevoir des programmes performants. Les programmes s'exécutent en
appelant directement les fonctions du système (APIs). Ils sont donc
plus petits

et plus rapides.

Le JAVA est un langage interprété. Les programmes conçus ainsi ont
besoin d'un traducteur (Machine virtuelle java) avant d'être exécutés.
Ce qui implique

une grande perte de performances et de ressources système. Le seul
avantage de cette technique est le fait que ça tourne sur tous les OS
(Windows, Linux

Mac OS etc) car chacun dispose de sa propre machine virtuelle java.

Donc, pour faire de la vraie programmation, apprend les bases du
langage C, entraine toi en faisant de petits programmes, puis peu à peu
tout devient facile

avec l'habitude. Tu trouveras sur ce site de nombreux codes et tutoriels.
3
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
2 févr. 2006 à 17:28
Salut,

Sous Windows, on utilise les APIs suivantes:

CreateFile() pour créer ou ouvrir un fichier.

CreateDirectory() pour créer un dossier.

FindFirstFile() pour trouver le premier fichier d'un dossier.

FindNextFile() pour trouver les fichiers suivants du même dossier.

Toute la documentation en anglais est dans le site MSDN.
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
2 févr. 2006 à 17:30
meme pour vc++6.0 ?? il me semble qu'il n'y a plus que poue lz .net
sinon merci je vais faire des recherche sur ces fonction^^

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
2 févr. 2006 à 17:32
Voici le lien MSDN de la page contenant toutes les fonctions API de manipulation des fichiers sous Windows:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/file_management_functions.asp
0

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

Posez votre question
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
2 févr. 2006 à 17:44
Les APIs marchent avec tous les compilateurs pour Windows.

J'ai toujours utilisé ces APIs avec Visual C/C++ 6. Ca marche même sur les anciennes versions.
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
2 févr. 2006 à 17:47
merci bcp ^^

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
2 févr. 2006 à 18:05
j'ai trouver ce code et je voulais savoir si les commentaire que j'ai ajouter son bon (donc si j'ai bien compris le fonctionnement de la source) :

#define _WIN32_WINNT 0x0501 //heuu ca si qqun pouvez me l'expliquer ??

#include <windows.h>
#include <string.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
WIN32_FIND_DATA FindFileData; //represnte pour le moment un fichier vide
HANDLE hFind = INVALID_HANDLE_VALUE; // je sais aps trop l'expliquer ... le processus on va dire
char DirSpec[MAX_PATH + 1]; // directory specification
DWORD dwError; //double mot pour une erreur je presume

printf ("Target directory is %s.\n", argv[1]);//on affiche le fichier passer par argument
strncpy (DirSpec, argv[1], strlen(argv[1])+1);//on le copi dans dirspec en faisant attention au debordement
strncat (DirSpec, "\\*", 3);//on coupe mais je ne sais pas trop pourquoi

hFind = FindFirstFile(DirSpec, &FindFileData);//on copie le premier fichier trouver de dirspec dans FindFileData et on recupere le code
//de l'operation dans hfind

if (hFind == INVALID_HANDLE_VALUE) {
/*
au cas ou le code retourne serait une erreur bien que je ne
sache pas ou est ce qu'il trouve INVALID_HANDLE_VALUE
*/
printf ("Invalid file handle. Error is %u\n", GetLastError());//affiche le message d'erreur
return (-1);//quitte le prog
}
else //si c'est bon
{
printf ("First file name is %s\n", FindFileData.cFileName);//on affiche le champs cFileName de la variable (pointeur ?)FindFileData
while (FindNextFile(hFind, &FindFileData) != 0) //tant qu'il y a encore des fichier ...
{
printf ("Next file name is %s\n", FindFileData.cFileName);//...on l'affihe
}

dwError = GetLastError();// je pense que c qqchose pour recuperer une erreur mais ou est declaré GetLastError
FindClose(hFind);//fermeture du flux
if (dwError != ERROR_NO_MORE_FILES) //la je comprend plus :$ :s
{
printf ("FindNextFile error. Error is %u\n", dwError);
return (-1);
}
}
return (0);
}

voila ... est ce que vous pourriez apportez quelques precision sil vous plait ?

merci
"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
2 févr. 2006 à 18:10
#define _WIN32_WINNT 0x0501 //heuu ca si qqun pouvez me l'expliquer ??
#include <windows.h>
#include <string.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
WIN32_FIND_DATA FindFileData; //represnte pour le moment un fichier vide
HANDLE hFind = INVALID_HANDLE_VALUE; // je sais aps trop l'expliquer ... le processus on va dire
char DirSpec[MAX_PATH + 1]; // directory specification
DWORD dwError; //double mot pour une erreur je presume

printf ("Target directory is %s.\n", argv[1]);//on affiche le fichier passer par argument

strncpy (DirSpec, argv[1], strlen(argv[1])+1);//on le copi dans dirspec en faisant attention au debordement strncat (DirSpec, "\\*", 3);//on coupe mais je ne sais pas trop pourquoi
hFind = FindFirstFile(DirSpec, &FindFileData);//on copie le premier fichier trouver de dirspec dans FindFileData et on recupere le code //de l'operation dans hfind

if (hFind == INVALID_HANDLE_VALUE) {

/*
au cas ou le code retourne serait une erreur bien que je ne sache pas ou
est ce qu'il trouve INVALID_HANDLE_VALUE
*/

printf ("Invalid file handle. Error is %u\n", GetLastError());//affiche le message d'erreur
return (-1);//quitte le prog

} else //si c'est bon

{ printf ("First file name is %s\n", FindFileData.cFileName);//on affiche le champs cFileName de la variable (pointeur ?)FindFileData
while (FindNextFile(hFind, &FindFileData) != 0) //tant qu'il y a encore des fichier ...

{ printf ("Next file name is %s\n", FindFileData.cFileName);//...on l'affihe

} dwError = GetLastError();// je pense que c qqchose pour recuperer une erreur mais ou est declaré GetLastError FindClose(hFind);//fermeture du flux

if (dwError != ERROR_NO_MORE_FILES) //la je comprend plus :$ :s
{
printf ("FindNextFile error. Error is %u\n", dwError);
return (-1);
}
}
return (0);
}
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
2 févr. 2006 à 18:42
#define _WIN32_WINNT 0x0501 permet au compilateur de reconnaitres les nouvelles fonctions de Windows XP

et supérieur. Dans ce cas, le programme généré ne fonctionnera pas sous les systèmes qui ne contiennent pas ces

fonctions comme Windows 98 par exemple.

HANDLE hFind = INVALID_HANDLE_VALUE; // Initialisation de hFind pour une première utilisation.
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
2 févr. 2006 à 18:44
ouais mais cela represente quoi exactement ?
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
2 févr. 2006 à 18:47
GetLastError() est une API qui permet de retrouver le code d'erreur de la dernière opération.

Si cette fonction retourne ERROR_NO_MORE_FILES ça veut dire qu'il n'y a plus de fichiers dans le dossier de recherche.
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
2 févr. 2006 à 18:48
ok merci

mais je parle de handle ?? j'ai cherche sur msdn et le peut que j'ai trouver je n'ai pas tres bien saisie ???


merci pour ton aide
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
2 févr. 2006 à 18:55
L'initialisation de hFind n'est pas obligatoire.

INVALID_HANDLE_VALUE = La valeur du handle retourné n'est pas valide.

A bientôt! Je reviens plutard.
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
2 févr. 2006 à 18:57
ok mci et pour ton retour ^^ lol
que represente handle ? c quoi son utilité general ? ce n'est pas rien que pour ca en c++ non ?
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 20
2 févr. 2006 à 19:03
handle est un 'descripteur', valeur maintenue dans une table par le système.
Il y a des handles pour les fichiers, les objets GDI, etc...

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
2 févr. 2006 à 19:05
en gros c comment dire , pour parler java , la super class : Object (en java) , elle prend n'importe quel valeur et peut contenir n'importe quoi ?
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 20
2 févr. 2006 à 19:13
Je ne fais pas de java donc...
Le handle est une valeur que le système te fournit sur un retour d'API, le prog user s'en sert pour appels d'autres APIs et basta. On ne doit jamais en changer soi même la valeur ni lui attribuer quoi que ce soit sinon devient invalide.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
2 févr. 2006 à 19:15
a ok je comprend , une sorte d'identifiant e fait...

je croi que je n'aurai jamais aussi bien compris comment fonctionne le c++ ce soir

merci a vous deux


ps : le java c genial
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 20
2 févr. 2006 à 19:16
En interne (le kernel) c'est un pointeur vers une zone mémoire mais un prog user ne doit jamais essayer de déréférencer le pointeur, l'adresse du pointeur est invalide dans l'espace du processus en mode user.
Il faut donc considérer le handle comme une simple valeur.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 20
2 févr. 2006 à 19:17
Tout ceci n'a rien à voir avec le langage C++, c'est le fonctionnement du système Windows.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0