Introduction

前回は、デバッグ時に引数を指定して実行してみました。

今回はファイルパスを使ったAPIのメモです。

System.IO.DirectoryInfo

相対パス扱いなの?

前回、デバッグ引数として、 ~/ を指定しました。
Linuxにおいてこのパスは、実行ユーザのホームディレクトリを示します。
(~ も同様。) これを使って、下記のコードを実行します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;

namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
var path = args[0];
Console.WriteLine($"Path is '{path}'");
foreach(var f in new System.IO.DirectoryInfo(path).GetFiles())
Console.WriteLine($"{f.Name}");
}
}
}

よくある、指定したパスの配下のファイルを列挙するプログラムです。

これを実行すると下記の例外を投げます。

1
2
3
4
5
6
7
8
Unhandled Exception: System.IO.DirectoryNotFoundException: Could not find a part of the path '/home/XXXXXX/git/Demo/DotNetCoreLinux3/~/'.
at System.IO.UnixFileSystem.FileSystemEnumerable`1.OpenDirectory(String fullPath)
at System.IO.UnixFileSystem.FileSystemEnumerable`1.Enumerate()
at System.IO.UnixFileSystem.FileSystemEnumerable`1..ctor(String userPath, String searchPattern, SearchOption searchOption, SearchTarget searchTarget, Func`3 translateResult)
at System.IO.UnixFileSystem.EnumerateFileSystemInfos(String fullPath, String searchPattern, SearchOption searchOption, SearchTarget searchTarget)
at System.IO.DirectoryInfo.InternalGetFiles(String searchPattern, SearchOption searchOption)
at System.IO.DirectoryInfo.GetFiles()
at ConsoleApplication.Program.Main(String[] args) in /home/XXXXXX/git/Demo/DotNetCoreLinux3/Program.cs:line 11

Could not find a part of the path ‘/home/XXXXXX/git/Demo/DotNetCoreLinux3/~/‘ という記述から、指定したパスは、カレントディレクトリからの相対パス扱いになってしまいました。
なので、System.IO.Path.GetFullPath メソッドで絶対パスに変換してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;

namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine($"Argument is '{args[0]}'");

var path = System.IO.Path.GetFullPath(args[0]);
Console.WriteLine($"Path is '{path}'");

foreach(var f in new System.IO.DirectoryInfo(path).GetFiles())
Console.WriteLine($"{f.Name}");
}
}
}

変わらず同じ例外が出力されます。
デバッグコンソールの出力は下記のようになります。

1
2
Argument is '~'
Path is '/home/XXXXXX/git/Demo/DotNetCoreLinux3/~'

なので、**~** はダメな模様。

ルートから指定してみる

Windowsでも、パス指定の際の基準はカレントディレクトリになりました。
でも、フルパスを指定したなら、それはフルパスとして解釈されます。
間違っても、**<カレントディレクトリ><フルパス>** みたいな解釈はされません。
Linuxでもそうなるでしょうか? Linuxにおけるルートは / になります。
次は、デバッグ引数に / を指定して、実行してみます。
無事に最後まで実行できています。
また、**/** はGetFullPathでも / として認識されています。

きちんとルートディレクトリの内容と比較してみます。
同じ内容であることがわかります。

Conclusion

少しずつ基本的なAPIを使えるようになってきました。
Windows/Mac/Linuxでの挙動の違いを比較してみたいですね。