2009-01-30 19 views
10

¿Cómo se recorre un árbol de directorios en su idioma favorito?¿Cuáles son todas las formas de atravesar árboles de directorios?

¿Qué necesita saber para recorrer un árbol de directorios en diferentes sistemas operativos? En diferentes sistemas de archivos?

¿Cuál es su biblioteca/módulo favorito para ayudar a atravesar un árbol de directorios?

+1

que no te lo Downvote, pero creo que sé por qué alguien hizo - esta es una pregunta muy vaga, y doesn Parece que resuelve cualquier problema en particular. –

+0

Esta es una pregunta de código de golf. ¿Estamos ahora bajando el código de golf? –

+0

Erik, acabo de publicarlo pensando que sería un buen "éxito" para SO en Google. – skiphoppy

Respuesta

3

En 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

En Java:

La recursividad es útil aquí. Lo que sigue es un fragmento de código de Java que ha estado presente en Internet durante siglos. No estoy seguro de quién merece el crédito por ello.

// 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

En Python:

Si usted está buscando una manera rápida, limpia y portátil pruebe la solución:

import os 
base_dir = '.' 

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

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

Tenga en cuenta que puede modificar foo para hacer otra cosa en su lugar de solo imprimir los nombres. Además, si está interesado en migrar a Python 3.0, deberá usar os.walk() en su lugar.

1

mmmm, C# con una dosis de recursividad .....

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

Creo que deberíamos competir con nuestras implementaciones: P –

+0

+1 para "filez"() – RCIX

2

en Linux con herramientas GNU

find -print0 | xargs -0 md5sum 

o

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 

(adaptado de http://ubuntuforums.org/showthread.php?t=886272 comentario 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

También: http://pocoproject.org/docs/Poco.DirectoryIterator.html –

Cuestiones relacionadas