相対パスを使用してファイルの存在を確認するための最良の方法は何ですか。
次のメソッドを使用しましたが、ファイルが存在するにもかかわらずfalseを返します。
bool a = File.Exists("/images/Customswipe_a.png");
相対パスを使用してファイルの存在を確認するための最良の方法は何ですか。
次のメソッドを使用しましたが、ファイルが存在するにもかかわらずfalseを返します。
bool a = File.Exists("/images/Customswipe_a.png");
それは相対的な道ではありません。最初のものを省略する必要があります。/
そうしないと、ルート化されていると解釈されます(つまり、C:/ images ...)
このコードをasp.netアプリケーションで実行していると思います。そのため、falseが発生します。
asp.netServer.MapPath("/images/Customswipe_a.png")
では、(Webアプリケーションのルートディレクトリに対して)「正しい」パスを取得するために使用する必要があります。それ以外の場合は、Webサーバー実行可能ファイル(IIS / WEBDAV / .. nameその他)のローカルパスを取得します。
相対パスは、現在の作業ディレクトリからの相対パスです。アプリケーションディレクトリではない可能性があります。GetCurrentDirectory()を呼び出して、テストしている実際のパスを確認します。
ファイルが何に関連しているかを定義する必要があります
Path.Combine
これらのいずれの場合も、方法によって絶対パスに変換することをお勧めします。
public static readonly string AppRoot = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
...
//calling with a '/' heading makes the path absolute so I removed it
var fullPath = Path.Combine(AppRoot, "images/Customswipe_a.png");
var exists = File.Exists(fullPath);
このようにして、探している場所を保証できます。[ファイルを開く/保存]ダイアログでさえ、現在のディレクトリを変更する場合があります。したがって、File.Exists
フルパスなしで呼び出すことは、通常、間違った決定です。
このパスは、System.IO.DirectoryInfoを使用してテストできます。
DirectoryInfo info = new DirectoryInfo("/images/Customswipe_a.png");
string absoluteFullPath = info.FullName;
マイクパークが正しく答えたので、このパスは(すなわちC:/ images ...)である可能性が高いです
相対パスは、何かに対する相対パスです。このAPIでは、ドキュメントFile.Existsによると次のようになります。
相対パス情報は、現在の作業ディレクトリからの相対パスとして解釈されます。
したがって、ここでのすべては、このクエリの実行時点でのCurrentDirectotyが何であるかによって異なります。
さらに、パスは有効なデスクトップパスではありません(Webファイルまたは知識から選択したと思います)。指定されたパスに無効な文字が含まれているかどうかを理解するには、GetInvalidCharacters関数を使用します。
特定のケースでは、を使用するだけで十分@"\images\Customswipe_a.png"
です。
パスは、バイナリファイルの場所を基準にしています。Visual Studioプロジェクトの場合、これは次のようになります。%PROJECTDIR%/bin/(RELEASE||DEBUG)/
私がすることは、ファイルシステムのルートを構成ファイルに入れ、それを相対パスに使用することです。
WinFormsアプリケーションでは、次のコマンドでexeファイルのディレクトリを取得できます。
string directory =
Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath);
別のソリューションはReflectionを使用します
string directory =
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
.NET Core 3.1以降、これは機能します。
依存性注入を使用してサービスを含めるIWebHostEnvironment
private IWebHostEnvironment Env;
public MyController (IWebHostEnvironment env){
Env = env;
}
次に、それを使用してアプリのルートへのパスを取得しますEnv.ContentRootPath
そしてそれをすべて組み合わせる:
var file = System.IO.Path.Combine(Env.ContentRootPath, "images", "some-file.png");