web-dev-qa-db-ja.com

.NET Coreでのクロスプラットフォームファイル名の処理

System.IOクラスのファイル名をクロスプラットフォームで処理して、WindowsおよびLinuxで動作させるにはどうすればよいですか?

たとえば、Windowsで完全に動作するこのコードを記述しますが、Ubuntu Linuxではファイルを作成しません。

var tempFilename = $@"..\Data\uploads\{filename}";
using (FileStream fs = System.IO.File.Create(tempFilename))
{
    file.CopyTo(fs);
    fs.Flush();                    
}
21
Rem

バックスラッシュを使用したWindows。スラッシュを使用するLinux。 Path.Combineは正しいシンボルを設定します:
Path.Combineメソッド-MSDN

26
user6522773

以下のようにPath.DirectorySeparatorCharを使用することもできます。

 Console.WriteLine("..{0}Data{0}uploads{0}{{filename}}", Path.DirectorySeparatorChar);

参照: [〜#〜] msdn [〜#〜]

32

単にスラッシュを使用できます。相対パスは同じように機能し、絶対パスはメインドライブのルートに対してのみ相対的です(「c:」で始まる絶対パスは移植性がないため)

4
Paul Stelian

たくさんの良い答え。 Path.Combineを使用してディレクトリセパレーターチャットを指定する必要を回避できることを追加したいと思います。

「。\ ..\toto\app.config」に比較的配置されているファイルの例:

Path.Combine("..", "toto", "app.config");

残念ながら、Path.Combineは、.Net Coreの絶対パスへの相対パスを解決しません。 Path.GetFullPathはそのためにあります:

Path.GetFullPath(Path.Combine("..", "toto", "app.config"))
1
Vilmir

元の投稿は1年以上前ですが、私はまだこの問題に遭遇しました。相対パスでのドットの使用も問題のように思えます。

のようなパス

".\\input\\mydata.csv" 

windowsではうまく機能しましたが、UNIXでは機能しませんでした。現在のディレクトリのドット表記を次のように変更する場合:

Path.GetFullPath(Directory.GetCurrentDirectory())

もっと成功しました。

1
user3042674