Как вы перемещаете дерево каталогов на своем любимом языке?
Что вам нужно знать, чтобы пересечь дерево каталогов в разных операционных системах? В разных файловых системах?
Какая ваша любимая библиотека/модуль для помощи в обходе дерева каталогов?
Как вы перемещаете дерево каталогов на своем любимом языке?
Что вам нужно знать, чтобы пересечь дерево каталогов в разных операционных системах? В разных файловых системах?
Какая ваша любимая библиотека/модуль для помощи в обходе дерева каталогов?
В 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().
В 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]));
}
}
}
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
(адаптирован из http://ubuntuforums.org/showthread.php?t=886272 Комментарий # 4)
В С#:
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);
});
}
С++
#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)) {
...
}
}
В Linux с инструментами GNU
find -print0 | xargs -0 md5sum
или
find -print0 | xargs -0 -iASD echo 'this file "ASD" should be dealt with lile this (ASD)'
mmmm, С# с дозой рекурсии.....
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;
}