ディレクトリ内のファイルを再帰的に列挙する C++ C# golang
2019年7月19日
C++ も以前は再帰呼出しを自前で書いてましたが、標準で用意されたようです。
それぞれ、引数のディレクトリ内のファイルを出力します。
エラー処理やリンクのループはチェックしていません。
#include <iostream>
#include <filesystem> // C++17
int main( int numArguments, char const* arguments[])
{
if( numArguments <= 1) return -1;
auto path = arguments[1];
// 引数1がディレクトリなら開始
if( std::filesystem::is_directory( std::filesystem::path( path)))
{
// ディレクトリ内を再帰的に走査する
for( const std::filesystem::directory_entry& it : std::filesystem::recursive_directory_iterator( path))
{
if( it.is_regular_file())
{
// ファイルなら出力する
std::cout << it.path().string() << std::endl;
}
}
}
return 0;
}
class Program
{
static void Main( string[] args)
{
if( args.Length == 0) return;
var top = args[0];
// 再帰呼び出しでディレクトリ内を走査する
// デリゲートを宣言とインスタンスを分けると再帰呼び出しができる
System.Action<string> recursive = null;
recursive = ( string path) =>
{
var entries = System.IO.Directory.EnumerateFileSystemEntries( path);
foreach( var it in entries)
{
if( System.IO.File.Exists( it))
{
// ファイルなら出力
System.Console.WriteLine( it);
}
else
if( System.IO.Directory.Exists( it))
{
// ディレクトリなら自分自身を呼ぶ
recursive( it);
}
}
};
if( System.IO.Directory.Exists( top))
{
// 引数1がディレクトリなら走査開始
recursive( top);
}
}
}
package main
import (
"fmt"
"flag"
"io/ioutil"
"path/filepath"
)
func main() {
var recursive func( path string)
recursive = func( path string) {
files, _ := ioutil.ReadDir( path)
for _, file := range files {
fullpath := filepath.Join( path, file.Name())
if file.IsDir() {
// ディレクトリなら自分自身を呼ぶ
recursive( fullpath)
} else {
// ファイルなら出力
fmt.Println( fullpath)
}
}
}
flag.Parse()
args := flag.Args()
if len( args) == 0 {
return;
}
recursive( args[0])
}
c# は Linqを使うともっと綺麗に書けるのかな?要調査
One Comment