Откройте определенный файл в vb.net

Я хочу, чтобы моя программа открывала определенный файл .txt. Текстовый файл всегда будет оставаться в одной и той же папке в папке решения. Однако расположение самой папки решения может измениться, если решение перемещено на другой компьютер или в другой каталог на текущем компьютере.

Я знаю, как жестко указать путь к файлу, добавить имя файла, а затем открыть его. Но как определить путь к файлу, чтобы файл все еще можно было открыть, если решение переместится на другой компьютер?


person Bernoulli Lizard    schedule 09.10.2013    source источник


Ответы (4)


Если вы хотели сказать, что ваш FileName.txt всегда присутствует в том же каталоге, что и сборка, вы можете сделать что-то простое, например:

Function GetAssemblyDirectoryPath() As String
    Dim fullAssemblyPath As String = System.Reflection.Assembly.GetExecutingAssembly().Location
    Return fullAssemblyPath.Substring(0, fullAssemblyPath.LastIndexOf("\"c))
End Function

Это просто возвращает путь к папке, в которой находится сборка. «Решение» может присутствовать не всегда, но сборка будет, поэтому это будет работать в обоих случаях (если вы убедитесь, что файл всегда копируется в выходной каталог).

person rory.ap    schedule 09.10.2013
comment
Это не просто возвращает путь к файлу. Он возвращает filepath\Projectname.exe, поэтому я не могу просто добавить к нему имя своего файла. Я мог бы сделать что-то грязное, например, удалить последние n символов из этой строки, но это кажется плохим вариантом. - person Bernoulli Lizard; 11.10.2013
comment
Не это не правильно. System.Reflection.Assembly.GetExecutingAssembly().Location возвращает путь к файлу\Projectname.exe, но если вы используете всю опубликованную мной функцию, она удаляет имя файла и просто дает вам путь к папке. - person rory.ap; 11.10.2013

Если файл содержится в решении, вы можете использовать виртуальный путь, который затем сопоставляется с физическим путем с помощью Server.MapPath.

Следующее должно работать:

Dim filePath As String = Server.MapPath("~/FileName.txt")

Обратите внимание, что расположение FileName.txt в моем примере находится в корне решения, а не в каких-либо указанных папках, ~/ по сути является корнем текущего решения.

Дополнительные сведения о методе Server.MapPath и виртуальных путях см. ниже:

Документация MSDN Server.MapPath

Класс служебной программы виртуального пути

person Nunners    schedule 09.10.2013
comment
Не работает. Ошибка Имя «сервер» не объявлено. Нет предложений по исправлению. - person Bernoulli Lizard; 11.10.2013

Если вы спрашиваете о настольном приложении, application.ExecutablePath сделает то, что вы хотите. Однако это не очень хорошая идея, если ваше приложение будет находиться в Program Files — лучше избегать записи куда-либо внутри него, и вам придется работать от имени администратора в ОС post-XP.

person peterG    schedule 09.10.2013

Если вы уверены, что файлы вашего приложения (.exe) и (.txt) находятся в одной папке, то просто используйте имя файла — путь не ставьте.

IO.File.OpenText("thefile.txt")

Отредактировано: в основном «текущий рабочий каталог» — это тот же каталог, в котором существует файл (.exe). Да, иногда это не тот же каталог. Таким образом, Application.ExecutablePath будет правильным решением.

Dim fn As String
fn = Application.ExecutablePath.Remove(Application.ExecutablePath.LastIndexOf("\")+1) & "thefile.txt"
IO.File.OpenText("thefile.txt")

...

person Tun Zarni Kyaw    schedule 09.10.2013
comment
На самом деле, я не думаю, что это обязательно верно. В соответствии с этим msdn.microsoft.com/en-us/library/b9skfh7s.aspx, при использовании относительного пути предполагается текущий рабочий каталог. И согласно определению этого (msdn.microsoft. com/en-us/library/), это не всегда совпадает с каталогом, из которого был запущен процесс. - person rory.ap; 09.10.2013
comment
@roryap, вы указали на хороший момент. В основном текущий рабочий каталог — это тот же каталог, в котором существует файл (.exe). Да, иногда это не тот же каталог. Таким образом, Application.ExecutablePath будет правильным решением. Спасибо - person Tun Zarni Kyaw; 09.10.2013
comment
Это тоже не работает, выдает ошибку Исполняемый файл не является членом system.windows.forms.application. - person Bernoulli Lizard; 11.10.2013