Лучший способ получить путь к каталогу данных приложения?

Получить путь к каталогу данных приложения можно несколькими способами:

  • используя переменную окружения %APPDATA%
  • звоню SHGetFolderPath с CSIDL_APPDATA

Каков наилучший способ получить путь из программы? Есть ли какие-то ошибки, когда я использую переменную среды?

Какой метод безопаснее для XP, Vista и последующих версий?


person Torsten Marek    schedule 31.01.2009    source источник


Ответы (5)


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

У Рэймонда Чена есть статья, объясняющая, почему извлечение таких путей из реестр - плохая идея.

person Rob    schedule 31.01.2009
comment
Я читал статью, и раньше я делал именно то, что мне нельзя делать в статье:) - person Torsten Marek; 31.01.2009

    string appDataPath = 
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); 

Вам нужно будет использовать метод GetFolderPath для получения фактического пути, поскольку Environment.SpecialFolder.ApplicationData — это просто перечисление.

person jMM    schedule 03.02.2010

Если вы программируете в .NET, вы можете использовать это:

string appDataPath = Environment.SpecialFolder.ApplicationData;
person Jason Miesionczek    schedule 10.02.2009
comment
SpecialFolder.ApplicationData — это перечисление, а не путь. Используйте Environment.GetFolderPath, как показано в ответе @jMM. - person JulianM; 02.09.2010

Одно важное отличие Python: в случае путей к файлам в формате Юникод ctypes.windll.shell32.SHGetFolderPathW возвращает строку в формате Юникод, тогда как os.environ['APPDATA'] возвращает строку в байтах.

person krawyoti    schedule 02.10.2009

Если кому интересно, в Ruby команда будет выглядеть так:

appDataPath = ENV['APPDATA'] 
person rchn    schedule 27.02.2012