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();
}
バックスラッシュを使用したWindows。スラッシュを使用するLinux。 Path.Combineは正しいシンボルを設定します:
Path.Combineメソッド-MSDN
以下のようにPath.DirectorySeparatorCharを使用することもできます。
Console.WriteLine("..{0}Data{0}uploads{0}{{filename}}", Path.DirectorySeparatorChar);
参照: [〜#〜] msdn [〜#〜]
単にスラッシュを使用できます。相対パスは同じように機能し、絶対パスはメインドライブのルートに対してのみ相対的です(「c:」で始まる絶対パスは移植性がないため)
たくさんの良い答え。 Path.Combineを使用してディレクトリセパレーターチャットを指定する必要を回避できることを追加したいと思います。
「。\ ..\toto\app.config」に比較的配置されているファイルの例:
Path.Combine("..", "toto", "app.config");
残念ながら、Path.Combineは、.Net Coreの絶対パスへの相対パスを解決しません。 Path.GetFullPathはそのためにあります:
Path.GetFullPath(Path.Combine("..", "toto", "app.config"))
元の投稿は1年以上前ですが、私はまだこの問題に遭遇しました。相対パスでのドットの使用も問題のように思えます。
のようなパス
".\\input\\mydata.csv"
windowsではうまく機能しましたが、UNIXでは機能しませんでした。現在のディレクトリのドット表記を次のように変更する場合:
Path.GetFullPath(Directory.GetCurrentDirectory())
もっと成功しました。