A certain engineer "COMPLEX"

.NETでLinuxと遊んでみる Visual Studio Code編 第3回

Introduction


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

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

System.IO.DirectoryInfo


相対パス扱いなの?

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

これを使って、下記のコードを実行します。


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

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

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


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メソッドで絶対パスに変換してみます。


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

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


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

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

ルートから指定してみる

Windowsでも、パス指定の際の基準はカレントディレクトリになりました。
でも、フルパスを指定したなら、それはフルパスとして解釈されます。
間違っても、<カレントディレクトリ>\<フルパス>みたいな解釈はされません。

Linuxでもそうなるでしょうか?
Linuxにおけるルートは/になります。

次は、デバッグ引数に/を指定して、実行してみます。
無事に最後まで実行できています。
また、/はGetFullPathでも/として認識されています。

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

Conclusion


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

コメントを残す

メールアドレスが公開されることはありません。

%d人のブロガーが「いいね」をつけました。