Установка правильного пути к файлу для сохранения txt - vb.NET

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

По сути, это приложение будет установлено в личных папках пользователей, возможно, что-то вроде «Локальные данные», и мне нужно получить текстовый файл, созданный программой, который будет создан в том же каталоге, что и исполняемый файл.

Текущий путь:

Dim strFilePath As String = "D:\Development\Bobby\Prototyping\Replication Desktop Client\Replication_Desktop_Client\ClientAccessList.txt"

Я хочу установить что-то вроде

Dim strCurrentLocationOfEXE As String = HardDriveLetter & Users & CurrentUserPath & InstalledDirectory
Dim strFilePath As String = strCurrentLocationOfEXE & "\ClientAccessList.txt"`

но я не могу понять, как заставить его определить это, так как он не будет всегда устанавливаться в одну и ту же папку (т.е. имя пользователя и, возможно, буква жесткого диска будут разными).

Идеи?


person Bobby Nicholls    schedule 08.04.2013    source источник
comment
Вам нужно искать переменные среды для конкретной ОС ... Посмотрите здесь для введения: en.wikipedia.org/ вики/переменная_среды   -  person Minus    schedule 08.04.2013
comment
Позвольте мне изменить его, спросив, будет ли это работать для сохранения txt-файла в папке данных перемещаемого приложения пользователей, а также будет ли правильно создаваться папка клиента репликации? Dim strCurrentAppDataPath As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData & "\Replication Client") Dim strFilePath As String = strCurrentAppDataPath & "\ClientAccessList.txt"   -  person Bobby Nicholls    schedule 08.04.2013
comment
Если вы хотите создать новую папку, вам нужно явно создать ее в качестве отдельного шага. Лучше использовать Path.Combine, чем напрямую объединять пути.   -  person Steven Doggart    schedule 08.04.2013
comment
Попался, я так и думал. Есть ли причина, по которой использование path.combine лучше, чем его объединение самостоятельно?   -  person Bobby Nicholls    schedule 08.04.2013
comment
Конкатенация, безусловно, будет работать, просто Path.Combine дает вам дополнительный уровень абстракции на случай, если формат пути отличается от ожидаемого в текущей операционной системе. Например, вполне возможно, что кто-то может запустить ваше приложение на Linux-машине под Mono, и в этом случае вместо обратной косой черты следует использовать прямую косую черту. Это не имеет большого значения, но это просто хорошая практика.   -  person Steven Doggart    schedule 08.04.2013
comment
Попался, к счастью, рынок для этого приложения состоит только из пользователей Windows, клиенты, которые используют это, не могут иметь машины с Linux из-за требований их других контрактов, поэтому я не слишком беспокоюсь об этом, но я обязательно буду иметь это в виду. на случай, если что-то изменится.   -  person Bobby Nicholls    schedule 08.04.2013


Ответы (2)


Вы можете получить путь, по которому работает сборка, с помощью

Dim fullPath = System.Reflection.Assembly.GetExecutingAssembly().Location
Dim folderName = Path.GetDirectoryName( fullPath )
Dim strFilePath = Path.Combine(folderName, "ClientAccessList.txt")

если вы хотите сослаться на личную папку текущего пользователя для этого приложения, то путь через Environment.SpecialFolder перечисление.
Это перечисление не зависит от базовой ОС (XP, Win7, x64, x32 и т. д.). В этом случае вы можете использовать:

Dim fullPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Dim strFilePath = Path.Combine(fullPath, "your_app_reserved_folder", "ClientAccessList.txt")

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

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

Public Function GetUserAppClientAccessList() As String

    Dim fullPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
    Dim appFolder = Path.Combine(fullPath, "your_app_reserved_folder")
    if Not Directory.Exists(appFolder) then
        Directory.Create(appFolder)
    End If
    return = Path.Combine(appFolder, "ClientAccessList.txt")
End Function
person Steve    schedule 08.04.2013
comment
Итак, у меня есть изменение к моему вопросу. посмотрите комментарии к вопросу - person Bobby Nicholls; 08.04.2013
comment
Это работает, возвращая путь, по которому работает сборка. Она может отличаться от папки Roaming или Local для текущего пользователя. Если вам нужен независимый путь из пользовательской папки, то путь - это перечисление Environment.SpecialFolder. - person Steve; 08.04.2013
comment
Ммм... Итак, я думаю, что не хочу, чтобы файл txt сохранялся в месте сборки, только в перемещаемых пользователями данных приложения. что мне нужно знать, так это то, что мне придется также создать логику, которая проверяет, существует ли клиент репликации папки, прежде чем пытаться установить путь к данным папки? Или он автоматически создаст, если его там нет...? - person Bobby Nicholls; 08.04.2013
comment
Нет, как я уже сказал, папка не существует автоматически только потому, что вы на нее ссылаетесь. Однако проверить существование папки очень просто. - person Steve; 08.04.2013

Это даст вам путь к исполняемому файлу:

Assembly.GetEntryAssembly().Location

А затем, чтобы получить путь к папке, вы можете вызвать Path.GetDirectoryName. Итак, чтобы получить путь к текстовому файлу, вы можете сделать что-то вроде этого:

Dim exeFilePath As String = Assembly.GetEntryAssembly().Location
Dim exeFolderPath As String = Path.GetDirectoryName(exeFilePath)
Dim filePath As String = Path.Combine(exeFolderPath, "ClientAccessList.txt")

Одно предостережение: Assembly.GetEntryAssembly может вернуть Nothing, если нет исполняемого файла сборки .NET, например, если код вызывается как библиотека через COM. В этом случае вы можете использовать путь к исполняемому файлу из командной строки, вызвав Environment.GetCommandLineArgs()(0). И если это по какой-то причине не удается, вы всегда можете прибегнуть к Directory.GetCurrentDirectory().

person Steven Doggart    schedule 08.04.2013
comment
Итак, у меня есть изменение к моему вопросу. посмотрите комментарии к вопросу - person Bobby Nicholls; 08.04.2013
comment
Я думаю, что предпочел бы сохранить его в папке appdata, но мне просто нужно, чтобы он был достаточно динамичным, чтобы получить правильную папку роуминга appdata для пользователей... - person Bobby Nicholls; 08.04.2013