Использование WritePrivateProfileString для записи проблемы пути - PullRequest
0 голосов
/ 21 февраля 2012

Я использую WritePrivateProfileString в c # (через DllImport) для хранения путей, взятых из текстовых полей на интерфейсе.И имя файла .ini жестко закодировано в моем приложении

string ini_file = ".\\config.ini";

Однако, когда происходит запись файла, файл конфигурации записывается по первому пути, взятому из интерфейса, вместо записи его в каталог exe.Что довольно странно.Отладка показывает, что значения правильно отправляются в WritePrivateProfileString, но все равно записывается в неправильное место.Кто-нибудь знает, почему это происходит?

Ответы [ 3 ]

1 голос
/ 21 февраля 2012

В дополнение к ответу Дэвида Хеффернана - вы можете использовать

Path.GetDirectoryName(Application.ExecutablePath);

, чтобы безопасно получить только часть папки запущенного приложения.

Если вы находитесь в dll, а не в исполняемом файле, выможно использовать

Path.GetDirectoryName(Assembly.GetAssembly(typeof(MyClass)).CodeBase);

Оба требуют System.IO, и были первоначально размещены здесь .Второй пример также требует System.Reflection).

1 голос
/ 21 февраля 2012

Я предполагаю, что что-то меняет рабочий каталог вашего процесса, скорее всего, ваш код в процессе. Обратите внимание, что документация содержит следующее:

Если параметр lpFileName не содержит полный путь и имя файла для файла, WritePrivateProfileString выполняет поиск файла в каталоге Windows. Если файл не существует, эта функция создает файл в каталоге Windows.

Теперь я предполагаю, что это применимо, если вы указываете только имя файла. Поскольку имя вашего файла начинается с ., я считаю, что это заставит функцию запускаться из текущего рабочего каталога.

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

Вы можете найти путь к вашему исполняемому файлу, используя Application.ExecutablePath, а затем удалить часть имени файла.

Еще одно замечание: тот же каталог, что и исполняемый файл, может быть неправильным выбором. Если ваша программа установлена ​​в каталоге Program Files, то каталог, в котором находится исполняемый файл, будет недоступен для записи. Я думаю, вы должны рассмотреть возможность использования каталога в профиле пользователя. Найдите одно из значений Environment.SpecialFolder.

0 голосов
/ 27 марта 2013

Файлы данных приложения должны быть записаны в специальную папку LocalApplicationData.

string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData);

Как правило, у вас не будет прав на запись в папку Program Files и т. Д.

...