ディレクトリ内のファイルを再帰的に列挙する C++ C# golang

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

Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です