2009-01-30 6 views
10

Comment traverser une arborescence dans votre langue préférée?Quels sont tous les moyens de parcourir les arborescences de répertoires?

Que devez-vous savoir pour parcourir une arborescence de répertoires dans différents systèmes d'exploitation? Sur différents systèmes de fichiers?

Quelle est votre bibliothèque/module favori pour vous aider à parcourir une arborescence de répertoires?

+1

Je ne vous ai pas downvote, mais je pense que je sais pourquoi quelqu'un a fait - c'est une question très vague, et doesn n'apparaissent pas pour résoudre des problèmes particuliers. –

+0

Ceci est une question de code-golf. Sommes-nous maintenant en train de voter des codes-golf? –

+0

Erik, je l'ai juste posté en pensant que ça ferait un bon "top hit" pour SO dans Google. – skiphoppy

Répondre

3

Dans C#:

Stack<DirectoryInfo> dirs = new Stack<DirectoryInfo>(); 

dirs.Push(new DirectoryInfo("C:\\")); 

while (dirs.Count > 0) { 
    DirectoryInfo current = dirs.Pop(); 

    // Do something with 'current' (if you want) 

    Array.ForEach(current.GetFiles(), delegate(FileInfo f) 
    { 
     // Do something with 'f' 
    }); 

    Array.ForEach(current.GetDirectories(), delegate(DirectoryInfo d) 
    { 
     dirs.Push(d); 
    }); 
} 
6

Dans Java:

récursivité est utile ici. Vous trouverez ci-dessous un extrait de code Java diffusé sur Internet depuis de nombreuses années. Je ne sais pas qui mérite le crédit pour cela.

// Process all files and directories under dir 

    public static void visitAllDirsAndFiles(File dir) { 

     process(dir); //do something useful with the file or dir 

     if (dir.isDirectory()) { 
      String[] children = dir.list(); 
      for (int i=0; i<children.length; i++) { 
       visitAllDirsAndFiles(new File(dir, children[i])); 
      } 
     } 
    } 
7

Dans Python:

Si vous êtes à la recherche d'une solution essayer rapide, propre et portable:

import os 
base_dir = '.' 

def foo(arg, curr_dir, files): 
    print curr_dir 
    print files 

os.path.walk(base_dir, foo, None) 

Notez que vous pouvez modifier foo pour faire autre chose d'imprimer simplement les noms. En outre, si vous êtes intéressé par la migration vers Python 3.0, vous devrez utiliser os.walk() à la place.

1

mmmm, C# avec une dose de récursion .....

public static List<string> CrawlPath(string path, bool IncludeSubFolders) 
{ 
    List<string> fileList = new List<string>(); 
    try 
    { 
     Stack<string> filez = new Stack<string>(Directory.GetFiles(path)); 
     while (filez.Count > 0) 
     { 
      fileList.Add(filez.Pop()); 
     } 

     if (IncludeSubFolders) 
     { 
      filez = new Stack<string>(Directory.GetDirectories(path)); 
      while (filez.Count > 0) 
      { 
       string curDir = filez.Pop(); 
       fileList.AddRange(CrawlPath(curDir, IncludeSubFolders)); 
      } 
     } 
    } 
    catch (System.Exception err) 
    { 
     Console.WriteLine("Error: " + err.Message); 
    } 
    return fileList; 
    } 
+0

Je pense que nous devrions courir nos implémentations: P –

+0

+1 pour "filez"() – RCIX

2

sur Linux avec des outils GNU

find -print0 | xargs -0 md5sum 

ou

find -print0 | xargs -0 -iASD echo 'this file "ASD" should be dealt with lile this (ASD)' 
4

bash:

#!/bin/bash 

function walk_tree { 
     echo "Directory: $1" 
     local directory="$1" 
     local i 
     for i in "$directory"/*; 
     do 
     echo "File: $i" 
     if [ "$i" = . -o "$i" = .. ]; then 
      continue 
     elif [ -d "$i" ]; then # Process directory and/or walk-down into directory 
      # add command here to process all files in directory (i.e. ls -l "$i/"*) 
      walk_tree "$i"  # DO NOT COMMENT OUT THIS LINE!! 
     else 
      continue # replace continue to process individual file (i.e. echo "$i") 
     fi 
     done 
} 

walk_tree $HOME 

(adapté de http://ubuntuforums.org/showthread.php?t=886272 Commentaire # 4)

3

C++

#include <utility> 
#include <boost/filesystem.hpp> 
#include <boost/foreach.hpp> 

#define foreach BOOST_FOREACH 
namespace fs = boost::filesystem; 

fs::recursive_directory_iterator it(top), eod; 
foreach (fs::path const & p, std::make_pair(it, eod)) { 
    if (is_directory(p)) { 
     ... 
    } else if (is_regular_file(p)) { 
     ... 
    } else if (is_symlink(p)) { 
     ... 
    } 
} 
+0

Aussi: http://pocoproject.org/docs/Poco.DirectoryIterator.html –

Questions connexes