[.NET Core][Tips] System.IO.Directory 編(2)

はじめに

本記事は、.NET Core における System.IO.Directory クラス の 逆引き Tips です。

今回は、以下を紹介します。

環境

.NET Core 2.2

指定したパスに存在するディレクトリを取得するには?

指定したパスに存在するディレクトリを取得するには、GetDirectories メソッド または EnumerateDirectories メソッドを使用します。

GetDirectories(string) 引数で指定したパスに存在するディレクトリを配列で返します。
EnumerateDirectories(string) 引数で指定したパスに存在するディレクトリをコレクションで返します。

GetDirectories も EnumerateDirectories もディレクトリの一覧を列挙しますが、EnumerateDirectories はキャッシュを持たないという点で異なります。EnumerateDirectories は全てのディレクトリを列挙する前に取り出しを開始することができます。一方 GetDirectories は全てのディレクトリを一括で配列に返すため、多くのディレクトリを取得するのには向いていません。

以下に GetDirectories と EnumerateDirectories の使用例を示します。

using System;
using System.IO;
using System.Collections.Generic;

namespace IOSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var path = "/Users/hiroki/Projects";

            try
            {
                // ディレクトリを取得する
                string[] dirs1 = Directory.GetDirectories(path);

                foreach(var dir in dirs1)
                {
                    Console.WriteLine(dir);
                }

                Console.WriteLine();

                // ディレクトリをす取得する
                List<string> dirs2 = new List<string>(Directory.EnumerateDirectories(path));

                foreach (var dir in dirs2)
                {
                    Console.WriteLine(dir);
                }

            }
            catch ( IOException  ex)
            {
                Console.WriteLine(ex.Message);
            }
           
        }
    }
}

指定したパスから検索パターンに一致するディレクトリを列挙するには?

指定したパスから検索パターンに一致するディレクトリを取得するには、GetDirectories メソッド または EnumerateDirectories メソッドを使用します。

 

GetDirectories(string, string)

指定したパスから検索パターンに一致するディレクトリを配列で返します。

第1引数:取得対象のディレクトリが存在するパス
第2引数:対象ディレクトリを検索するパターン。ワイルドカード文字(* または ?)を使用することができますが、正規表現はサポートしていません。

EnumerateDirectories(string, string)

指定したパスから検索パターンに一致するディレクトリをコレクションで返します。

第1引数:取得対象のディレクトリが存在するパス
第2引数:対象ディレクトリを検索するパターン。ワイルドカード文字(* または ?)を使用することができますが、正規表現はサポートしていません。

 

以下に検索パターンを指定してディレクトリの一覧を取得する例を示します。この例では「My」で始まるディレクトリのみを取得します。

using System;
using System.IO;
using System.Collections.Generic;

namespace IOSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var path = "/Users/hiroki/Projects";

            try
            {
                // ディレクトリを取得する
                string[] dirs1 = Directory.GetDirectories(path,"My*");

                foreach(var dir in dirs1)
                {
                    Console.WriteLine(dir);
                }

                Console.WriteLine();

                // ディレクトリをす取得する
                List<string> dirs2 = new List<string>(Directory.EnumerateDirectories(path,"My"));

                foreach (var dir in dirs2)
                {
                    Console.WriteLine(dir);
                }

            }
            catch ( IOException  ex)
            {
                Console.WriteLine(ex.Message);
            }
           
        }
    }
}

指定したパスに存在するディレクトリに含まれるサブディレクトリも取得するには?

指定したパスに存在するディレクトリに含まれるサブディレクトリも検索したい場合は、検索オプションが指定可能な、GetDirectories メソッド または EnumerateDirectories メソッドを使用します。

GetDirectories(String, String, SearchOption)

指定したパスから検索パターンに一致するディレクトリを配列で返します。

第1引数:取得対象のディレクトリが存在するパス
第2引数:対象ディレクトリを検索するパターン。ワイルドカード文字(* または ?)を使用することができますが、正規表現はサポートしていません。
第3引数:以下に示すSearchOption列挙体を参照してください。

EnumerateDirectories(String, String, SearchOption)

指定したパスから検索パターンに一致するディレクトリをコレクションで返します。

第1引数:取得対象のディレクトリが存在するパス
第2引数:対象ディレクトリを検索するパターン。ワイルドカード文字(* または ?)を使用することができますが、正規表現はサポートしていません。
第3引数:以下に示すSearchOption列挙体を参照してください。

第3引数に指定可能な SearchOption 列挙体を以下に示します。

AllDirectories 現在のディレクトリとすべてのサブディレクトリも対象とします。 このオプションを指定した場合、検索範囲に、マウントされたドライブやシンボリック リンクのようなリパース ポイントも対象にします。
TopDirectoryOnly 検索操作を現在のディレクトリのみにします。

以下に使用例を示します。この例では「My」で始まるディレクトリとその下にある「My」で始まるサブディレクトリのみを取得します。

using System;
using System.IO;
using System.Collections.Generic;

namespace IOSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var path = "/Users/hiroki/Projects";

            try
            {
                // ディレクトリを取得する
                string[] dirs1 = Directory.GetDirectories(path,"My*", SearchOption.AllDirectories);

                foreach(var dir in dirs1)
                {
                    Console.WriteLine(dir);
                }

                Console.WriteLine();

                // ディレクトリをす取得する
                List<string> dirs2 = new List<string>(Directory.EnumerateDirectories(path,"My*", SearchOption.AllDirectories));

                foreach (var dir in dirs2)
                {
                    Console.WriteLine(dir);
                }

            }
            catch ( IOException  ex)
            {
                Console.WriteLine(ex.Message);
            }
           
        }
    }
}

[TypeScript] 外部の ts ファイルに定義されたクラスを使用するには?

TypeScript の開発において、常に1つの ts ファイルを使用するとは限りません。

場合によっては、クラスごとにファイルを作成する場合もあるでしょう。

今回は、複数の ts ファイルを連携して使用する方法について説明します。

目次

外部に定義された定数や関数を使用できるようにするには?

外部に定義された定数や関数を使用できるようにするには、export キーワードと import キーワードを使用します。

export キーワードは、「外部のファイルでも使用してもいいよ」ということを意味します。

例えば、定数 PI と GRAVITY、関数 add を外部ファイルでも使用可能にするには、以下のように export キーワードを付けて定義します。

// ファイル名:constant.ts

// 定数のエクスポート
export const PI = 3.14;
export const GRAVITY = 9.8; 

// 関数のエクスポート
export function add(x : number, y : number) : number {
    return x + y;
} 

一方、外部のファイルに定義された定数や関数を使用したい場合は、以下のように import キーワードの後ろの {} に使用したいものをカンマで区切って記述します。また from キーワードの後ろには、 export 対象が書かれているファイル名(拡張子は不要)を書きます。

あとは、あたかも自分自身のファイルに書かれているかのように使用することができます。

import {PI,GRAVITY,add} from "./constant";

console.log(PI);
console.log(GRAVITY);
console.log(add(3,2))

外部に定義されたクラスを使用するには?

外部に定義されたクラスも、定数や関数と同様に export キーワード と import キーワードを使用します。

以下は足し算をする add というメソッドが定義された Calculator クラスの export 定義をする例です。

export class Calculator {
    add(x: number, y: number): number {
        return x + y;
    }
};

使用方法も、定数や関数と同じで import キーワードを使用します。

import {Calculator} from "./calculator";

console.log(calc.add(1,2));

複数のファイルを1度にコンパイルできるようにするには?

本連載の1回目の記事「TypeScript 入門」の「tsconfig.jsonの作成」で tsconfig.json ファイルの作成方法を説明しました。

このファイルに files を追加することで任意の複数のファイルを1度にコンパイルできるようになります。

例えば、calculator.ts と test.ts のみをコンパイルできるようにするには 以下のように書きます。

{
	"compilerOptions": {
		"target": "es5",
		"module": "commonjs",
		"sourceMap": false
	},
	"files": [
		"calculator.ts",
		"test.ts"
	]
}