2009-01-30 11 views
10

W jaki sposób przechodzisz przez drzewo katalogów w swoim ulubionym języku?Jakie są wszystkie sposoby przechodzenia między drzewami katalogów?

Co trzeba wiedzieć, aby przemieścić drzewo katalogów w różnych systemach operacyjnych? Na różnych systemach plików?

Jaka jest twoja ulubiona biblioteka/moduł pomagający w przechodzeniu przez drzewo katalogów?

+1

nie downvote cię, ale chyba wiem, dlaczego ktoś to zrobił - to niezwykle ogólnikowe pytanie, i nie robi Wygląda na to, że rozwiązuje jakieś szczególne problemy. –

+0

To jest pytanie dotyczące kodu golfowego. Czy obecnie korzystamy z kodów do głosowania? –

+0

Erik, właśnie opublikowałem to, myśląc, że będzie to dobry "hit" dla SO w Google. – skiphoppy

Odpowiedz

3

W 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

W Java:

Rekurencja jest tu przydatna. Poniżej znajduje się fragment kodu Java, który od wieków istniał w Internecie. Nie jestem pewien, kto zasługuje na uznanie.

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

W Python:

Jeśli szukasz szybkiego, czystego i przenośnym try rozwiązanie:

import os 
base_dir = '.' 

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

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

Pamiętaj, że możesz zmienić foo zrobić coś innego zamiast tylko drukowanie imion. Ponadto, jeśli jesteś zainteresowany migracją do Pythona 3.0, będziesz musiał użyć os.walk().

1

mmmm, C# z dawką rekursji .....

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

Myślę, że powinniśmy ścigać się z naszymi implementacjami: P –

+0

+1 dla "filez"() – RCIX

2

W systemie Linux z narzędzi GNU

find -print0 | xargs -0 md5sum 

lub

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 

(zaadaptowane z http://ubuntuforums.org/showthread.php?t=886272 Komentarz 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

Również: http://pocoproject.org/docs/Poco.DirectoryIterator.html –