2009-01-30 3 views
10

Как вы проходите дерево каталогов на своем любимом языке?Каковы все способы перемещения деревьев каталогов?

Что вам нужно знать, чтобы пересечь дерево каталогов в разных операционных системах? В разных файловых системах?

Ваша любимая библиотека/модуль для помощи в обходе дерева каталогов?

+1

Я не downvote, но я думаю, что я знаю, почему кто-то сделал - это невероятно расплывчатым вопрос, и Безразлично Кажется, что они решают какие-либо конкретные проблемы. –

+0

Это вопрос кодового гольфа. Мы сейчас играем с кодами для голосования? –

+0

Эрик, я только что разместил его, думая, что это сделает хороший «топ-хит» для SO в Google. – skiphoppy

ответ

3

В 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

В Java:

Рекурсия полезна здесь. Ниже приведен фрагмент кода Java, который существует повсюду в Интернете. Не уверен, кто заслуживает этого.

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

В Python:

Если вы ищете быстрый, чистый и переносным попытки решения:

import os 
base_dir = '.' 

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

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

Заметим, что вы можете изменить Foo сделать что-то другое вместо просто распечатать имена. Кроме того, если вы хотите перейти на Python 3.0, вам придется использовать os.walk().

1

мммм, C# с дозой рекурсии .....

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

Я думаю, что мы должны участвовать в гонках наших реализаций: P –

+0

+1 для "filez"() – RCIX

2

На Linux с помощью инструментов GNU

find -print0 | xargs -0 md5sum 

или

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

Баш:

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

(адаптировано из http://ubuntuforums.org/showthread.php?t=886272 Комментарий 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

Также: http://pocoproject.org/docs/Poco.DirectoryIterator.html –