Un peu perdu...

[Résolu]
Signaler
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
-
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
-
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

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
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"
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
merci bcp ^^

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
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"
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
#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);
}
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
#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.
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
ouais mais cela represente quoi exactement ?
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
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 ?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
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 ?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
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
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++