web-dev-qa-db-ja.com

C#で相対パスのファイルを取得する方法

C#でコーディングしているapp.exeという実行可能ファイルがある場合、相対パスを使用してapp.exeと同じディレクトリにロードされたフォルダからファイルを取得するにはどうすればよいですか?

これにより、パス例外に不正な文字がスローされます。

string [ ] files = Directory.GetFiles ( "\\Archive\\*.Zip" );

C#でこれを行うにはどうすればよいですか?

30
Joan Venge

(現在のディレクトリだけでなく)アプリケーションのパスを確認するには、次を使用します。

http://msdn.Microsoft.com/en-us/library/system.diagnostics.process.getcurrentprocess.aspx

これで、実行中のプロセスを表すProcessオブジェクトができました。

次にProcess.MainModule.FileNameを使用します。

http://msdn.Microsoft.com/en-us/library/system.diagnostics.processmodule.filename.aspx

最後に、Path.GetDirectoryNameを使用して、.exeを含むフォルダーを取得します。

http://msdn.Microsoft.com/en-us/library/system.io.path.getdirectoryname.aspx

だからこれはあなたが望むものです:

string folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Archive\";
string filter = "*.Zip";
string[] files = Directory.GetFiles(folder, filter);

(質問の"\Archive\"@"\Archive\"になっていることに注意してください:\バックスラッシュがエスケープシーケンスの開始として解釈されないように@が必要です)

お役に立てば幸いです!

40
string currentDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
string archiveFolder = Path.Combine(currentDirectory, "archive");
string[] files = Directory.GetFiles(archiveFolder, "*.Zip");

最初のパラメーターはパスです。 2番目は、使用する検索パターンです。

30
Adam Lear

次のように書きます:

string[] files = Directory.GetFiles(@".\Archive", "*.Zip");

。は、exeを開始したフォルダーに対する相対名であり、@は名前に\を許可します。

フィルターを使用する場合、2番目のパラメーターとして渡します。パターンを再帰的に検索するかどうかを指定する3番目のパラメーターを追加することもできます。

.exeが実際に存在するフォルダーを取得するには、次を使用します。

var executingPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
15
Mikael Svenson

他の人が言ったように、文字列の前に@を追加することができます(バックスラッシュをエスケープすることもできます)が、それらが光沢を持っているもの(つまり、関連する変更を加えても、私が最近発見したように、現在のディレクトリを表すために\なしでパス名の先頭に.を使用すると、現在のディレクトリツリーのルートを参照するという事実でした。

C:\foo\bar>cd \
C:\>

versus

C:\foo\bar>cd .\
C:\foo\bar>

.を単独で使用することは、私の経験から.\を単独で使用することと同じ効果があります。何らかの理由で同じことを意味しない特定のケースがあるかどうかはわかりません。)

必要に応じて、先頭の.\をそのままにすることもできます。

C:\foo>cd bar
C:\foo\bar>

実際、本当に必要な場合は、バックスラッシュを使用する必要さえありません。スラッシュは完璧に機能します! (ただし、単一の/は、\のように現在のドライブルートにエイリアスしません。)

C:\>cd foo/bar
C:\foo\bar>

それらを交互にすることもできます。

C:\>cd foo/bar\baz
C:\foo\bar\baz>

...しかし、私は本当にここで話題から外れたので、興味がなければ自由にこれを無視してください。

2
JAB

かなり簡単です。相対パスを使用します

string[] offerFiles = Directory.GetFiles(Server.MapPath("~/offers"), "*.csv");
0
Alejandro R