Forum Programmation.c++ Manipulation de fichiers.

Posté par  .
Étiquettes : aucune
0
7
mar.
2007
Bonjour,

Je cherche à faire une lib pour simplifier l'utilisation des fichiers pour un programme. C++ et linux only
Pour les methodes suivantes, j'ai trouvé comment faire avec les includes disponibles sur linux :
- recursiveDelete()
- isDir()
- isFile()
- lastModified()
- length()

Mais, pour beaucoup d'actions, je ne sais pas comment faire en C++. Donc je me demande si la seule solution est de lancer des commandes shell, ou si linux met à disposition des interfaces C/C++ que je n'ai pas trouvé...
Voici les fonctions :
- recursiveLength() //taille d'un dossier
- ProcessWorkingDirectory()
- rcp() // remote copy
- cp
- mv
- usedSpace() // sur un systeme de fichier
- availableSpace() // sur un systeme de fichier
- totalSpace()// sur un systeme de fichier
- canExecute()
- canRead()
- canWrite()
- createNewFile()
- exists()
- getName()
- getParent()
- mkdir()
- setLastModified()

Savez vous faire ca directement en C/C++ sans invoquer du bash ?

Pour canExecute, canRead et canWrite, je ne vois meme pas comment le faire simplement en bash... (une idée?)

merci,
Guillaume.
  • # fstat

    Posté par  . Évalué à 1.

    creuse du côté de fstat, tu devrais avoir quelques pistes.

    man fstat

    dans la section 2 du man (les system calls donc)

    a+
    • [^] # Re: fstat

      Posté par  . Évalué à 1.

      lu,

      stat et fstat, ca permet de faire :
      - isDir()
      - isFile()
      - lastModified()
      - length()

      Et éventuelement :
      - canExecute()
      - canRead()
      - canWrite()
      Mais il faut savoir qui on est (user) et a quels groupes on est ...
      Je ne sais pas trop comment avoir ces 2 informations.
      Et une fois qu'on les a, le traitement n'est pas instantané car :
      - regarder si user equivalent, droits user
      - puis si un group equivalent, droits group
      - puis other sinon
      C'est pour ca que j'espére qu'il existe des fonctions dans l'interface standard de Linux (car je n'ai pas le droit d'utiliser des libs genre boost ou autre).
      • [^] # Re: fstat

        Posté par  . Évalué à 1.


        car je n'ai pas le droit d'utiliser des libs genre boost ou autre).


        tu ne voudrais quand meme pas que l'on fasse tes devoirs à ta place...
  • # man stat

    Posté par  . Évalué à 2.

    Pour canExecute, canRead et canWrite, je ne vois meme pas comment le faire simplement en bash... (une idée?)


    man 1 stat pour la commande shell
    man 2 stat pour la primitive noyau en C.
    man bash pour savoir tout faire.

    [ -r fichier ] en shell pour voir s'il est lisible,
    [ -w fichier ] en shell pour voir s'il est inscriptible,
    [ -x fichier ] en shell pour voir s'il est exécutable.

    Pour le reste, la plupart de ces fonctions sont des primitives du système, donc des appels noyau, donc des fonctions écrites en C.

    Pour les fonctions récursives, je pense qu'il s'agit en revanche d'une implémentation du shell et qu'elles n'existent pas en tant que telle au sein du système.

    Je ne sais pas s'il existe une bibliothèque standard C++ pour y parvenir.
    • [^] # Re: man stat

      Posté par  . Évalué à 1.

      merci,

      Un peu la meme réponse :

      - ok pour canRWX, on peut le faire avec stat.

      - par contre, les autres fonctions non...
  • # Devoir...

    Posté par  (site web personnel) . Évalué à 2.

    Ça me rappelle un cours en C en iut ;)

    - recursiveLength() //taille d'un dossier
    Va voir le code de du (disk usage dans le paquet coreutils, il le fait)

    - ProcessWorkingDirectory()
    C'est de la magouille ça soit tu va voir pwd, soit tu te tape le code.
    En gros tu remonte d'un cran a chaque fois et tu compare le numéro d'inode de .. avec . (rep parent et courant), quand c'est le même tu as atteins la racine, et y a plus qu'a concaténer le chemin résultat au retour de ta fonction récursive.

    - rcp() // remote copy
    (aucune idée)

    - cp
    créer un nouvel inode et copier le contenu dedans ?
    (je prie pour toi que tu aie pas les paramètres a prendre en charge...)

    - mv
    idem avec un unlink sur l'ancien fichier a la fin
    - usedSpace() // sur un systeme de fichier
    (voir man 2 statfs)
    - availableSpace() // sur un systeme de fichier
    (idem)
    - totalSpace()// sur un systeme de fichier
    (idem)

    - canExecute()
    - canRead()
    - canWrite()
    (voir man stat comme dis au dessus)

    - createNewFile()
    (voir touch de coreutils)

    - exists()
    man 2 stats (tu te prendra une erreur particulière)
    - getName()
    man 2 stats sur . ?
    - getParent()
    man 2 stats sur ../
    - mkdir()
    man 2 mkdir
    - setLastModified()
    man 2 utime

    ps : pour ton code C dans du c++ faudra peut-être recourir a du :
    extern C {
    toncode_en_c_ici();
    }
    • [^] # Re: Devoir...

      Posté par  . Évalué à 1.

      Je ne dois pas forcément faire toutes les options.
      Mais par exemple, cp, rm et mv doivent etre récursifs.

      Pour les fonctions qui sont un peu complexes à implémenter, je vais me contenter d'utiliser system() ou popen() pour utiliser une commande shell.

      merci pour les réponses.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.