26

相対パスを使用してファイルの存在を確認するための最良の方法は何ですか。

次のメソッドを使用しましたが、ファイルが存在するにもかかわらずfalseを返します。

 bool a = File.Exists("/images/Customswipe_a.png");
4

9 に答える 9

13

それは相対的な道ではありません。最初のものを省略する必要があります。/そうしないと、ルート化されていると解釈されます(つまり、C:/ images ...)

于 2012-10-17T19:32:36.087 に答える
9

このコードをasp.netアプリケーションで実行していると思います。そのため、falseが発生します。

asp.netServer.MapPath("/images/Customswipe_a.png")では、(Webアプリケーションのルートディレクトリに対して)「正しい」パスを取得するために使用する必要があります。それ以外の場合は、Webサーバー実行可能ファイル(IIS / WEBDAV / .. nameその他)のローカルパスを取得します。

于 2012-10-17T19:43:32.607 に答える
6

相対パスは、現在の作業ディレクトリからの相対パスです。アプリケーションディレクトリではない可能性があります。GetCurrentDirectory()を呼び出して、テストしている実際のパスを確認します。

于 2012-10-17T19:33:19.207 に答える
4

ファイルが何に関連しているかを定義する必要があります

  • アプリケーションのメインアセンブリ?
  • カレントディレクトリ?
  • アプリケーションデータディレクトリ?
  • それに名前を付けます...

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フルパスなしで呼び出すことは、通常、間違った決定です。

于 2012-10-17T21:15:16.657 に答える
2

このパスは、System.IO.DirectoryInfoを使用してテストできます。

DirectoryInfo info = new DirectoryInfo("/images/Customswipe_a.png");
string absoluteFullPath = info.FullName;

マイクパークが正しく答えたので、このパスは(すなわちC:/ images ...)である可能性が高いです

于 2018-08-30T14:11:29.717 に答える
1

相対パスは、何かに対する相対パスです。このAPIでは、ドキュメントFile.Existsによると次のようになります。

相対パス情報は、現在の作業ディレクトリからの相対パスとして解釈されます。

したがって、ここでのすべては、このクエリの実行時点でのCurrentDirectotyが何であるかによって異なります。

さらに、パスは有効なデスクトップパスではありません(Webファイルまたは知識から選択したと思います)。指定されたパスに無効な文字が含まれているかどうかを理解するには、GetInvalidCharacters関数を使用します。

特定のケースでは、を使用するだけで十分@"\images\Customswipe_a.png"です。

于 2012-10-17T19:34:51.703 に答える
0

パスは、バイナリファイルの場所を基準にしています。Visual Studioプロジェクトの場合、これは次のようになります。%PROJECTDIR%/bin/(RELEASE||DEBUG)/

私がすることは、ファイルシステムのルートを構成ファイルに入れ、それを相対パスに使用することです。

于 2012-10-17T19:33:14.810 に答える
0

WinFormsアプリケーションでは、次のコマンドでexeファイルのディレクトリを取得できます。

string directory =
    Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath);

別のソリューションはReflectionを使用します

string directory =
    Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
于 2012-10-17T19:46:06.120 に答える
0

.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");
于 2020-03-26T15:59:10.100 に答える