Streamreader в относительный путь к файлу

Мне было интересно, если кто-нибудь может сказать мне, как указать StreamReader на файл в текущем рабочем каталоге программы.

Например: скажем, у меня есть программа Prog, сохраненная в каталоге "C:\ProgDir \". Я фиксирую "\ ProgDir" в общей папке. Внутри ProgDir находится еще один каталог, содержащий файлы, которые я хотел бы импортировать в Prog (например, "\ ProgDir\TestDir\TestFile.txt"). Я бы хотел сделать так, чтобы StreamReader мог читать эти TestFiles, даже когда путь к каталог изменился;

(Например, на моем компьютере путь к тестовым файлам

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 не существует в текущем контексте". У кого-нибудь есть идеи относительно того, как я должен подходить к этому?

Спасибо.

Ответ 1

Является ли папка "TestDir" всегда в исполняемом каталоге? если да, попробуйте это

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

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

Это даст вам путь к exe плюс папку внутри него и текстовый файл

Ответ 2

Вы можете использовать метод GetFullPath(). Попробуйте следующее:

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

Ответ 3

Несколько вещей:

Во-первых, FileInfo.FullName дает абсолютный путь для файла, поэтому вам не нужно добавлять полный путь к каталогу перед файлом в экземпляре StreamReader.

Во-вторых, FileInfo file = new FileInfo(TestFile.txt); должен завершиться ошибкой, если у вас действительно есть класс с именем TestFile с свойством txt.

Наконец, почти с каждым методом File они уже используют относительные пути. Таким образом, вы ДОЛЖНЫ иметь возможность использовать средство чтения потока в JUST относительном пути.

Дайте эти несколько вещей попробовать и сообщите нам.

Изменить: вот что вы должны попробовать:

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");

Ответ 4

FileInfo конструктор принимает один параметр строки типа. Попробуйте помещать кавычки вокруг TestFile.txt.

Измените

FileInfo file = new FileInfo(TestFile.txt);

to

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

Если TestFile не является объектом с именем txt строки типа, в этом случае вам нужно создать объект, прежде чем пытаться его использовать.

Ответ 5

Вы можете использовать path.combine, чтобы получить текущий каталог для сборки, а затем объединить нужный вам путь к файлу.

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

Ответ 6

Проще всего было бы просто использовать имя файла (не полный путь) и "TestDir" и дать StreamReader относительный путь.

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