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))
{
//...
}