2009-01-30 9 views
10

Wie durchqueren Sie einen Verzeichnisbaum in Ihrer bevorzugten Sprache?Wie können Verzeichnisbäume durchsucht werden?

Was müssen Sie wissen, um einen Verzeichnisbaum in verschiedenen Betriebssystemen zu durchlaufen? Auf verschiedenen Dateisystemen?

Welche Bibliothek/welches Modul unterstützt Sie am besten bei der Navigation in einem Verzeichnisbaum?

+1

Ich habe Sie nicht downvote, aber ich glaube, ich weiß, warum jemand tat - das ist ein unglaublich vage Frage, und doesn scheinen keine besonderen Probleme zu lösen. –

+0

Dies ist eine Code-Golf-Frage. Sind wir jetzt down-voting code-golfs? –

+0

Erik, ich habe es gerade gepostet, weil ich dachte, es wäre ein guter Hit für SO in Google. – skiphoppy

Antwort

3

In 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

In Java:

Rekursion ist hier nützlich. Es folgt ein Java-Code-Snippet, das seit Ewigkeiten im Internet verfügbar ist. Nicht sicher, wer das Verdienst dafür verdient.

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

In Python:

Wenn Sie sich für eine schnelle, saubere und tragbare Lösung try suchen:

import os 
base_dir = '.' 

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

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

Beachten Sie, dass foo ändern können, um etwas anderes zu tun, statt nur die Namen zu drucken. Wenn Sie an einer Migration zu Python 3.0 interessiert sind, müssen Sie stattdessen os.walk() verwenden.

1

mmmm, C# mit einer Dosis von Rekursion .....

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

Ich denke, wir sollten unsere Implementierungen Rennen: P –

+0

+1 für "Filez"() – RCIX

2

Unter Linux mit GNU-Tools

find -print0 | xargs -0 md5sum 

oder

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 

(angepasst von http://ubuntuforums.org/showthread.php?t=886272 Kommentar # 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

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