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 gaaaaaAab . Évalué à 1.
man fstat
dans la section 2 du man (les system calls donc)
a+
[^] # Re: fstat
Posté par guitouu . Évalué à 1.
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 NeoX . Évalué à 1.
tu ne voudrais quand meme pas que l'on fasse tes devoirs à ta place...
# man stat
Posté par Obsidian . Évalué à 2.
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 guitouu . Évalué à 1.
Un peu la meme réponse :
- ok pour canRWX, on peut le faire avec stat.
- par contre, les autres fonctions non...
# Devoir...
Posté par Raphaël G. (site web personnel) . Évalué à 2.
- 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 guitouu . Évalué à 1.
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.
[^] # Re: Devoir...
Posté par Raphaël G. (site web personnel) . Évalué à 2.
[^] # Re: Devoir...
Posté par guitouu . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.