web-dev-qa-db-ja.com

相対ファイルパスへのStreamreader

誰かがプログラムの現在の作業ディレクトリ内のファイルをStreamReaderにポイントする方法を教えてもらえないかと思っていました。

例:プログラムProgがディレクトリ「C:\ ProgDir \」に保存されているとします。 「\ ProgDir」を共有フォルダにコミットします。 ProgDirの内部には、Progにインポートするファイルを含む別のディレクトリがあります(たとえば、「\ ProgDir\TestDir\TestFile.txt」)。ディレクトリが変更されました。

(例えば、私のコンピューターでは、テストファイルへのパスは

C:\ ProgDir\TestDir\TestFile.txt

しかし、他の人のコンピュータでは、ディレクトリは

C:\ dev_code\ProgDir\TestDir\TestFile.txt

)。

StreamReaderを他の人のコンピュータのTestFile.txtから読み取るようにするにはどうすればよいですか? (明確にするために、ファイル名は変更されません、唯一の変更はパスProgDirです)

私は以下を試しました:

string currentDir = Environment.CurrentDirectory;
DirectoryInfo directory = new DirectoryInfo(currentDir);
FileInfo file = new FileInfo("TestFile.txt");

string fullDirectory = directory.FullName;
string fullFile = file.FullName;

StreamReader sr = new StreamReader(@fullDirectory + fullFile);

(からこれを引き出しました: 現在の作業ディレクトリからの相対パスを取得しますか?

しかし、「現在のコンテキストにTestFileは存在しません」というメッセージが表示されます。誰が私がこれにどのように取り組むべきかについて何か考えがありますか?

ありがとうございました。

10
gfppaste

フォルダ「TestDir」は常に実行可能ディレクトリにありますか?もしそうなら、これを試してください

    string dir =System.IO.Path.GetDirectoryName(
      System.Reflection.Assembly.GetExecutingAssembly().Location);

    string file = dir + @"\TestDir\TestFile.txt";

これはあなたにexeのパスとその中のフォルダとテキストファイルを与えます

13
hjgraca

GetFullPath()メソッドを使用できます。これを試して:

 string filePath = System.IO.Path.GetFullPath("TestFile.txt");
 StreamReader sr = new StreamReader(filePath);
10
RajN

いくつかのこと:

まず、_FileInfo.FullName_はファイルの絶対パスを与えるため、StreamReaderインスタンスのファイルの前に完全なディレクトリパスを付加する必要はありません。

次に、実際にTestFileプロパティを持つtxtというクラスがない限り、FileInfo file = new FileInfo(TestFile.txt);は失敗します。

最後に、ほとんどすべてのFileメソッドで、それらはすでに相対パスを使用しています。したがって、相対パスだけでストリームリーダーを使用できるようにする必要があります。

それらのいくつかのことを試して、私たちに知らせてください。

編集:あなたが試すべきことは次のとおりです:

_FileInfo file = new FileInfo("TestFile.txt");
StreamReader sr = new StreamReader(fullFile.FullName);
//OR
StreamReader sr = new StreamReader("TestFile.txt");
_

ただし、気付いたのは、TestFileがTestDirにあることです。実行可能ファイルがProgDirにある場合は、相対パスが正しくないため、失敗します。

代わりに_TestDir\TestFile.txt_に変更してみてください。 IE:StreamReader sr = new StreamReader("TestDir\TestFile.txt");

5
SPFiredrake

FileInfoconstructor は文字列型の単一のパラメーターを取ります。 TestFile.txtを引用符で囲んでください。

変化する

FileInfo file = new FileInfo(TestFile.txt);

FileInfo file = new FileInfo("TestFile.txt");

TestFileが、文字列型のtxtという名前のプロパティを持つオブジェクトでない場合、その場合、使用する前にオブジェクトを作成する必要があります。

2
Tester101

最も簡単な方法は、フルパスではなくファイル名と "TestDir"を使用して、StreamReaderに相対パスを与えることです。

var relativePath = Path.Combine(".","TestDir",fileName);
using (var sr = new StreamReader(relativePath))
{
   //...
}
0
Andreas

Path.combineを使用して、ビルドする現在のディレクトリを取得し、必要なファイルパスを組み合わせることができます

 new StreamReader(Path.Combine(Environment.CurrentDirectory, "storage"));
0
jorence jovin