What are all the ways to traverse directory trees?

浪子不回头ぞ 提交于 2019-11-30 14:57:05

问题


How do you traverse a directory tree in your favorite language?

What do you need to know to traverse a directory tree in different operating systems? On different filesystems?

What's your favorite library/module for aiding in traversing a directory tree?


回答1:


In Python:

If you're looking for a quick, clean, and portable solution try:

import os
base_dir = '.'

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

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

Note that you can modify foo to do something else instead of just printing the names. Furthermore, if you're interested in migrating to Python 3.0, you will have to use os.walk() instead.




回答2:


In Java:

Recursion is useful here. Following is a Java code snippet that's been all over the Internet for ages. Not sure who deserves the credit for it.

// 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]));
            }
        }
    }



回答3:


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

(adapted from http://ubuntuforums.org/showthread.php?t=886272 Comment #4)




回答4:


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);
    });
}



回答5:


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)) {
        ...
    }
}



回答6:


On Linux with GNU tools

find -print0 | xargs -0 md5sum

or

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



回答7:


mmmm, C# with a dose of recursion.....

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;
  }


来源:https://stackoverflow.com/questions/497243/what-are-all-the-ways-to-traverse-directory-trees

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!