La suppression d'un répertoire non vide par programmation en C ou C++
Comment faire pour supprimer un répertoire non vide de C ou C++? Est-il une fonction? rmdir supprime uniquement le répertoire vide. Veuillez fournir une voie sans l'aide d'aucune bibliothèque externe.
Aussi me dire comment supprimer un fichier en C ou C++?
- Il n'existe pas un tel langage comme le C/C++
- C'était peut-être downvoted parce que la question a été posée à de nombreuses reprises avant, par exemple stackoverflow.com/questions/1149764/delete-folder-with-items, et les gens sont malades de voir? Le downvoter n'était pas moi, BTW.
- non, mais c'est la deuxième fois aujourd'hui lex demande sur le c/c++. Et je suppose que j'ai trop vu reprend là où les gens prétendent qu'ils savent cette infâme langage c/c++ qui n'existe pas.
- Je pensais que la procédure standard en cas de duplication a été de laisser un commentaire, de ne pas downvote? (Je sais que ce n'était pas vous qui downvoted, mais vous semblez laisser entendre qu'il est normal que d'autres pourraient le faire)
- Pas tout le monde peut voter pour fermer, mais la plupart peuvent downvote.
- Mais tout le monde peut laisser un commentaire, et de l'OMI qui me serait plus productif que downvoting. Par exemple, je n'aurais pas répondu à cette question en particulier, si j'avais su que c'était un dup
- Différentes personnes ont des idées différentes sur la façon d'utiliser ce qu'il n'y a pas de "bonne" façon. Si vous voulez en discuter plus en profondeur (pas avec moi), ou lu beaucoup de questions sur le sujet, a obtenu de la Méta - lien au bas de cette page.
Vous devez vous connecter pour publier un commentaire.
Vous voulez écrire une fonction (une fonction récursive est plus facile, mais peut facilement exécuter hors de la pile de l'espace profond répertoires) qui va énumérer les enfants d'un répertoire. Si vous trouvez un enfant qui est un répertoire, vous recurse sur que. Sinon, vous supprimez les fichiers à l'intérieur. Lorsque vous avez terminé, le répertoire est vide, et vous pouvez le supprimer via le syscall.
Pour énumérer les répertoires sous Unix, vous pouvez utiliser
opendir
,readdir
, etclosedir
. Pour supprimer vous utilisezrmdir()
sur un répertoire vide (c'est à dire à la fin de votre fonction, après la suppression de l'enfants) etunlink()
sur un fichier. Notez que, sur de nombreux systèmes, lad_type
membre dansstruct dirent
n'est pas pris en charge; sur ces plateformes, vous devrez utiliserstat()
etS_ISDIR(stat.st_mode)
pour déterminer si un chemin est un répertoire.Sur Windows, vous allez utiliser
FindFirstFile()
/FindNextFile()
à énumérer,RemoveDirectory()
sur les répertoires vides, etDeleteFile()
pour supprimer les fichiers.Voici un exemple qui pourrait fonctionner sur Unix (complètement non testé):
WIN32_FIND_DATA
est énorme, alors queDIR *
etstruct dirent *
sont deux pointeurs..De nombreux systèmes de type unix (Linux, Bsd et mac OS X, à tout le moins) ont la
fts
fonctions pour une traversée de répertoire. Pour supprimer de manière récursive un répertoire, procédez à une profondeur d'abord la traversée (sans les liens symboliques), et supprimer toutes les visités fichier.fts
interface n'est pas disponible dans musl libc.fts
solution basée sur moins susceptibles de pile/tas des problèmes de dépassement de solutions que de manière itérative/récursivement utilisationopendir
/readdir
comme asveikau de l' ?La façon la plus simple de le faire est avec remove_all fonction de la poussée.Système de fichiers de la bibliothèque. En outre, le code résultant sera portable.
Si vous voulez écrire quelque chose de spécifique pour Unix (rmdir) ou Windows (RemoveDirectory), alors vous aurez à écrire une fonction qui supprime sont sous-fichiers et sous-dossiers de manière récursive.
MODIFIER
Ressemble à cette question a été déjà demandé, en fait, quelqu'un l'a déjà recommandé de Boost remove_all. Donc merci de ne pas upvote ma réponse.
Si vous utilisez un compatible POSIX OS, vous pouvez utiliser
nftw()
pour le fichier de parcours d'arbres et de supprimer supprime des fichiers ou des répertoires). Si vous êtes en C++ et votre projet utilise boost, c'est pas une mauvaise idée pour utiliser le Boost.Système de fichiers comme le suggère Manuel.Dans l'exemple de code ci-dessous j'ai décidé de ne pas traverser les liens symboliques et les points de montage (juste pour éviter un grand enlèvement:) ):
ntfw
. 🙂Vous pouvez utiliser fonctions opendir et readdir de lire les entrées du répertoire et dissocier pour les supprimer.
C++17 a
<experimental\filesystem>
qui est basée sur la relance de la version.Utilisation std::expérimental::filesystem::remove_all à supprimer récursivement.
Si vous avez besoin de plus de contrôle, essayez std::expérimental::filesystem::recursive_directory_iterator.
Vous pouvez également écrire votre propre récursivité avec la non-resursive version de l'itérateur.
unlink
permettra de supprimer un fichier.remove
va également supprimer un fichier, mais qui n'est plus portable.Vous pouvez essayer de
system("rm -r ./path")
si vous travaillez sous Linux, sinon il y a aussi une API de Windows récursif de la fonction de suppression.system()
fonctions peuvent être mieux mis à profit par le code en C, mais ouais, c'est rapide et méchant. Avec le fichier et le dossier de la suppressionset /p
est obligatoire.Comment supprimer un dossier non vide à l'aide de unlinkat() en c?
Voici mon travail sur elle: