IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

gestion de fichier sous windows en posix


Sujet :

Réseau C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut gestion de fichier sous windows en posix
    Bonjour.
    J’utilise code::blocks (et mingw32)
    J'aime le C depuis 15 ans mais ne l'utilise plus que de temps en temps.
    A l'époque je faisait du temps réel et autres choses embarquées...

    Je souhaite mettre en oeuvre une gestion de fichier sous windows en POSIX.
    J'ai déjà un petit prog comparable à celui des FAQ C. Il fait l'inventaire d'un répertoire. Cependant j’aimerais avoir plus d'info sur les formats comme la struct stat.
    Pour me faire un petit outil d'archivage, je cherche à :
    - Différencier un fichier d’un répertoire, pour faire du récursif.
    - Modifier l’attribut archive des fichiers traités pour les ignorer la fois suivante.
    - Faire calculs d’age des fichiers pour purger les vieux.
    Les headers ne sont des manuels et je ne trouve pas d’information sur cette structure et ces éléments pour windows.
    Si vous savez ou chercher cela m’arrange.

    Merci.
    :

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour et bienvenue sur les forums de developpez.com

    l'implémentation n'étant pas définie par la norme, il faut mettre les mains dans le camboui pour savoir comment c'est fait.
    En fouillant dans les fichiers d'en tête, on peut trouver la définition de la struture stat :
    extrait de stat.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    struct stat
    {
    	_dev_t	st_dev;		/* Equivalent to drive number 0=A 1=B ... */
    	_ino_t	st_ino;		/* Always zero ? */
    	_mode_t	st_mode;	/* See above constants */
    	short	st_nlink;	/* Number of links. */
    	short	st_uid;		/* User: Maybe significant on NT ? */
    	short	st_gid;		/* Group: Ditto */
    	_dev_t	st_rdev;	/* Seems useless (not even filled in) */
    	_off_t	st_size;	/* File size in bytes */
    	time_t	st_atime;	/* Accessed date (always 00:00 hrs local
    				 * on FAT) */
    	time_t	st_mtime;	/* Modified time */
    	time_t	st_ctime;	/* Creation time */
    };
    Mais à première vu mingw est conforme POSIX, donc inutile de réinventer la roue.
    Par contre je n'est pas trouvé les sources complètes de la biblitohèque C de mingw

  3. #3
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Pour ceux qui veulent réinventer la roue, sous linux du moins il y a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    S_ISDIR(m) qui dit si le fichier est un répertoire, m étant le champs [b]st_mode[/b]

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut gestion de fichier sous windows en posix
    Merci gege2061.

    J'ai bien définition de stat dans stat.h.
    Je penche pour utiliser : time_t st_mtime; /* Modified time */ type.h me dit que c'est en fait un long.
    Mais cela ne me dit pas comment c'est calculé, je vais devoir essayer plusieurs fichiers de date différente et retrouver le "protocol".
    pour les attributs je penche pour utiliser : _mode_t st_mode; /* See above constants */ c'est un unsigned short, mais là encore quel est le codage ?
    sur le net on trouve les fameuses constantes pour unix, mais quid en Windows ?

    Merci fearyourself
    approche intéressante. j'ai plus la culture de comparer le champ avec une valeur binaire (ce qui est sans doute codé dans IS_DIR). Faute de mieux, je prends ta soluce. As-tu la même pour archive ?
    et si quelqu'un a le codage de ce short ?
    C'est sans doute du genre : 1er bit à 1 = hiden; 2d bit à 1 = archive, etc.

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Re: gestion de fichier sous windows en posix
    Je ne vai pas recopier tout stat.h mais avec la version fournie avec code::block installé de ce matin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    /*
     * Constants for the stat st_mode member.
     */
    #ifndef __STRICT_ANSI__
    #endif
    #define	_S_IFIFO	0x1000	/* FIFO */
    #define	_S_IFCHR	0x2000	/* Character */
    #define	_S_IFBLK	0x3000	/* Block: Is this ever set under w32? */
    #define	_S_IFDIR	0x4000	/* Directory */
    #define	_S_IFREG	0x8000	/* Regular */
     
    #define	_S_IFMT		0xF000	/* File type mask */
     
    #define	_S_IEXEC	0x0040
    #define	_S_IWRITE	0x0080
    #define	_S_IREAD	0x0100
     
    #define	_S_IRWXU	(_S_IREAD | _S_IWRITE | _S_IEXEC)
    #define	_S_IXUSR	_S_IEXEC
    #define	_S_IWUSR	_S_IWRITE
    #define	_S_IRUSR	_S_IREAD
     
    #define	_S_ISDIR(m)	(((m) & _S_IFMT) == _S_IFDIR)
    #define	_S_ISFIFO(m)	(((m) & _S_IFMT) == _S_IFIFO)
    #define	_S_ISCHR(m)	(((m) & _S_IFMT) == _S_IFCHR)
    #define	_S_ISBLK(m)	(((m) & _S_IFMT) == _S_IFBLK)
    #define	_S_ISREG(m)	(((m) & _S_IFMT) == _S_IFREG)
     
    #ifndef _NO_OLDNAMES
     
    #define	S_IFIFO		_S_IFIFO
    #define	S_IFCHR		_S_IFCHR
    #define	S_IFBLK		_S_IFBLK
    #define	S_IFDIR		_S_IFDIR
    #define	S_IFREG		_S_IFREG
    #define	S_IFMT		_S_IFMT
    #define	S_IEXEC		_S_IEXEC
    #define	S_IWRITE	_S_IWRITE
    #define	S_IREAD		_S_IREAD
    #define	S_IRWXU		_S_IRWXU
    #define	S_IXUSR		_S_IXUSR
    #define	S_IWUSR		_S_IWUSR
    #define	S_IRUSR		_S_IRUSR
     
    #define	S_ISDIR(m)	(((m) & S_IFMT) == S_IFDIR)
    #define	S_ISFIFO(m)	(((m) & S_IFMT) == S_IFIFO)
    #define	S_ISCHR(m)	(((m) & S_IFMT) == S_IFCHR)
    #define	S_ISBLK(m)	(((m) & S_IFMT) == S_IFBLK)
    #define	S_ISREG(m)	(((m) & S_IFMT) == S_IFREG)

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    man fstat me donne:
    S_IFMT 0170000 bitmask for the file type bitfields
    S_IFSOCK 0140000 socket
    S_IFLNK 0120000 symbolic link
    S_IFREG 0100000 regular file
    S_IFBLK 0060000 block device
    S_IFDIR 0040000 directory
    S_IFCHR 0020000 character device
    S_IFIFO 0010000 fifo
    S_ISUID 0004000 set UID bit
    S_ISGID 0002000 set GID bit (see below)
    S_ISVTX 0001000 sticky bit (see below)
    S_IRWXU 00700 mask for file owner permissions
    S_IRUSR 00400 owner has read permission
    S_IWUSR 00200 owner has write permission
    S_IXUSR 00100 owner has execute permission
    S_IRWXG 00070 mask for group permissions
    S_IRGRP 00040 group has read permission
    S_IWGRP 00020 group has write permission
    S_IXGRP 00010 group has execute permission
    S_IRWXO 00007 mask for permissions for others (not in group)
    S_IROTH 00004 others have read permission
    S_IWOTH 00002 others have write permisson
    S_IXOTH 00001 others have execute permission
    Edition: gege2061 a été plus rapide que moi... ;-)
    Bon je vais répondre à l'autre question: sauf si je me trompe, le temps est toujours codé sous Unix (voir aussi Windows) de la même façon, c'est le nombre de secondes depuis minuit du 1er Janvier 1970...

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Pourquoi cette copie de stat.h, ai-je dit une bêtise ?

    J’avais intuité le coup du code ; le fait que S_ISDIR(m) soit une macro qui fasse une comparaison bit à bit , etc.
    Mais je ne sais toujours pas comment cette implémentation très particulière de POSIX gère l’attribut archive.
    Comme je ne comprends pas ce que signifie S_IFREG 0100000 regular file ;
    S_ISGID 0002000 set GID bit (see below) ; S_ISVTX 0001000 sticky bit (see below) ;
    L’implémentation peut détourner l’un de ces bits ….

    C’est quand même super sympa de me répondre en directe.
    Je m’attendais à trouver, au bout de 2 jours, un pointeur sur un site américain expliquant l’implémentation de POSIX sur Windows. Ce qui aurait été déjà très bien.

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Le codage est sous forme octal donc chaque chiffre représente 3 bits...

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ho pardon fearyourself

    C’est un site d’experts pointilleux sur les appellations ici.

    J’ai des excuses : Que le code C compare deux chiffres en base 16, 10 ou 8, la machine opère sur la version base 2 de la même valeur. J’ai pris la (peut être mauvaise) habitude de penser et parler du binaire même si je code un base 10.

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    P:\out>attrib titi.txt retour :> A P:\Amoi\out\titi.txt
    P:\out>attrib -A titi.txt
    P:\out>attrib titi.txt retour :> P:\Amoi\out\titi.txt

    toto.txt est Attrib Archive, pas titi.txt

    P:\out>direct2
    |. |X07/12/2005 17:19:01X++=16895=|
    |.. |X07/12/2005 17:19:01X++=16895=|
    |direct2.exe |X07/12/2005 17:18:39X++=33279=|
    |toto.txt |X06/12/2005 10:23:17X++=33206=|
    |titi.txt |X06/12/2005 10:23:17X++=33206=|

    entre = l'affichage de st_mode
    conclusion cet attribu n'est pas embarqué dans st_mode.

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par fan²
    J’ai des excuses : Que le code C compare deux chiffres en base 16, 10 ou 8, la machine opère sur la version base 2 de la même valeur. J’ai pris la (peut être mauvaise) habitude de penser et parler du binaire même si je code un base 10.
    "Il y a 10 sortes de gens. Ceux qui comprennent le binaire et les autres..."
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: gestion de fichier sous windows en posix
    Citation Envoyé par fan²
    Les headers ne sont des manuels et je ne trouve pas d’information sur cette structure et ces éléments pour windows.
    Si vous savez ou chercher cela m’arrange.
    http://msdn.microsoft.com

    Mais Windows est loin d'être POSIX... Il y a quelques ressemblances, mais c'est tout.

    Cependant, dans Windows NT, il existe un sous-système POSIX :

    http://www.microsoft.com/resources/documentation/windowsnt/4/workstation/reskit/en-us/poscomp.mspx

    Tout ceci n'a rien à voir avec le langage C. Le bon forum est "Développement Windows".
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. date de modification de fichier sous windows
    Par brisbo dans le forum Windows
    Réponses: 2
    Dernier message: 04/05/2006, 23h45
  2. Gestion des ports sous windows
    Par wass dans le forum Windows
    Réponses: 1
    Dernier message: 19/04/2006, 17h44
  3. Changer les droits d'un fichier sous windows
    Par lnikolanta dans le forum Général Conception Web
    Réponses: 6
    Dernier message: 26/09/2005, 17h03
  4. Routines de gestion des ports sous Windows XP
    Par wiccanhelios dans le forum Windows
    Réponses: 2
    Dernier message: 14/11/2003, 08h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo