Lorsque l'on souhaite travailler simplement avec les fichiers, on a intérêt à utiliser les fonctions type fopen() ou open() à moins que les performances soient un problème, au quel cas, sous Windows, on a intérêt à se tourner ver l'API Win32 (CreateFile(), ReadFile(), WriteFile() ...).
On note que sous Windows, l'implémentation des fonctions type fopen() ou open() finit toujours par un appel à l'API Win32 CreateFile().
Il n'y a rien de bien compliqué dans la gestion des fichiers. Une des choses auxquelles on doit prendre garde est le mode d'ouverture (t comme texte ou b comme binaire) en particulier sous Windows ou les fichiers sont ouverts en mode texte par défaut.
Fonctions utiles :
Exemple : fopen.c
Ces fonctions ont l'avantage de permettre l'écriture de code portable (Windows-Unix). On doit toujours se méfier du fait que ces fonctions ouvrent par défaut le fichier en mode texte sous Windows, donc qu'il faut changer le mode d'ouverture avec setmode( fd, O_BINARY ) si le fichier est binaire sous peine de remplacement des caractères 10 par 13/10 (\r\n) .
Fonctions utiles :
Exemple : open.c
Exemple : stat.c
Voir aussi :
Exemple : unlink.c
Il n'existe pas d'API portable pour gérer les locks des fichiers. Sous Unix, on utilise en général fcntl() et sous Windows, on utilise locking() qui appelle en interne LockFile()
Exemple : lock.c
L'exemple suivant permet de créer plusieurs niveaux de répertoires en un seul appel.
Exemple : createdirectorytree.c et createdirectorytree.h
La programme suivant permet le parcours d'une arborescence avec appel d'un callback à chaque fichier rencontré.
voir parcoursdir.c et parcoursdir.h
Portage de ces fonctions pour Windows. Le code provient de la librairie ucd-snmp.
Voir gettempdir.c et gettempdir.h
Sous linux, on peut smplement compiler le programme avec -D_FILE_OFFSET_BITS=64 (CFlags obtenu via la commande $ getconf LFS_CFLAGS). Cela change la taille du type off_t notamment utilisé par lseek().
Une autre solution consiste à utiliser explicitement les appels systèmes open64() et à définir __USE_LARGEFILE64.
Sous Windows, les API de base comme SetFilePointerEx() prennent cela en charge.