Где моя программа win32 должна хранить свои файлы? - PullRequest
11 голосов
/ 24 февраля 2009

Наши приложения win32 (написанные на C ++) существуют уже более 10 лет и не обновлялись в соответствии с «хорошими практиками» в отношении того, где они хранят файлы. По умолчанию приложение устанавливается в папку «C: \ AppName» и сохраняет сгенерированные приложением файлы, файлы конфигурации, загруженные файлы и сохраненные пользовательские документы в подпапках этой папки.

Предположительно, в настоящее время "лучшими практиками" является установка по умолчанию в "c: \ Program Files \ AppName". Но если мы сделаем это, где мы должны хранить остальные наши файлы? Начиная с Vista, запись в папку программных файлов проблематична, и, кажется, есть миллион других мест, где вы можете поместить разные файлы, и я запутался.

Где-нибудь есть ссылка на то, что куда идет?


Редактировать: Чтобы расширить вопросы, которые люди задавали до сих пор:


Я знаком с функцией SHGetFolderPath, но есть много и много опций, которые вы можете получить из нее, и я не могу найти ресурс, который говорит: «Вот именно для чего используется каждая из этих опций, и когда вы захотите его использовать ".

До сих пор мы выполняли функцию «Все файлы, включая сохраненные пользовательские файлы, в одной папке», и она работала нормально, но не тогда, когда люди хотят установить приложение в папке Program Files. По какой-то причине виртуализация, связанная с этой Vista, не работает для нашего приложения; если мы все равно будем вносить изменения, мы могли бы также попытаться сделать все «правильным» образом, поскольку нам не нужно менять его через 12 месяцев.


Дополнительный вопрос:


Мы включаем некоторые «образцы» документов в наше приложение, которые мы обновляем время от времени. Целесообразно ли устанавливать их в Мои документы, если мы будем перезаписывать их каждые несколько месяцев? Или предполагается, что Мои Документы абсолютно безопасны для пользователя?

Если мы не можем установить их в Мои документы, где мы должны их разместить, чтобы пользователи могли их легко увидеть?

Ответы [ 8 ]

15 голосов
/ 24 февраля 2009

Предположительно, по умолчанию рекомендуется установить в "c: \ Program Files \ AppName"

по умолчанию.

Близко, но не совсем. Пользователи могут настроить имя папки Program Files и могут даже не иметь диска C :. Вместо этого установите в папку переменной среды %ProgramFiles%\AppName. Обратите внимание, что вы должны предполагать, что у вас есть доступ на чтение к этой папке только после завершения установки.

Для файлов данных программы, для которых вам может потребоваться доступ для записи, используйте %AppData%\AppName.

Наконец, вы уверены, что ваше единственное приложение с таким именем? Если вы не уверены на 100%, возможно, вы захотите указать название вашей компании.

Механизмы, которые вы используете для получения этих переменных, будут различаться в зависимости от вашей программной платформы. Обычно это в конечном итоге сводится к методу SHGetFolderPath() Win32, но различные платформы, такие как Java или .Net, могут также предоставлять более простые абстракции.

9 голосов
/ 24 февраля 2009

В этой статье базы знаний приведены некоторые рекомендации: Как написать приложение для Windows XP, которое хранит данные пользователя и приложения в правильном месте с помощью Visual C ++ . Кроме того, если вы ищете MSDN для Windows Logo Program , вы найдете документацию о том, что приложение должно сделать, чтобы быть по-настоящему совместимым.

SHGetKnownFolderPath может получить нужные вам каталоги. Если требуется обратная совместимость с XP и более ранними версиями, используйте устаревшую SHGetFolderPath

Сказав это, если ваше приложение поставляется с документацией, в которой сказано, что "все, что используется этим приложением, находится в этом каталоге", я бы полюбил это;)

6 голосов
/ 24 февраля 2009

Используйте функцию Windows SHGetFolderPath () , чтобы получить правильные каталоги.

Редактировать: Чтобы ответить на другой вопрос, добавленный в редакторе: Место размещения примеров файлов вашего приложения очень сильно зависит от того, установлено ли ваше приложение для одного пользователя или для всех пользователей. и можно ли считать, что лицо, устанавливающее приложение, является тем, кто его использует.

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

IMO, вы должны установить примеры файлов в каталог, обозначенный CSIDL_COMMON_APPDATA . Это даст вам ровно одну копию для всех пользователей, и, поскольку вы хотите, чтобы каждый пользователь видел исходные неизмененные образцы файлов, все пользователи должны рассматривать их только для чтения. Фактически, ваша программа установки, вероятно, должна сделать их доступными только для чтения. Открытие одного из примеров будет работать для всех пользователей, но как только они попытаются сохранить свои модификации, приложение должно обнаружить, что файл доступен только для чтения, и открыть диалоговое окно «Сохранить как», указывая «Мои документы» или подходящее. каталог внутри. Это также сохранит все пользовательские изменения, когда установщик обновит файлы примеров позже.

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

2 голосов
/ 24 февраля 2009

Для двоичных файлов вашего приложения вы можете предположить, что вы можете записывать в каталог PROGRAM FILES (используйте переменную среды% ProgramFiles% для поддержки установок, отличных от английской версии по умолчанию - например, в немецких установках это будет c: \ Program by дефолт). Википедия перечисляет наиболее распространенные переменные. Другим вариантом являются функции SHGetFolderPath или более новые SHGetKnownFolderPath .

Для пользовательских данных вы должны предполагать, что приложение работает с ограниченными правами доступа и может выполнять запись только в домашний каталог пользователя. То же самое относится к записям реестра. Этот путь, вероятно, должен быть настраиваемым пользователем, поскольку домашний каталог может фактически быть сетевым сервером, и пользователю может быть подключен второй диск для хранения данных. Информацию о текущих (Vista) рекомендациях по файловой системе смотрите в этой статье .

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

0 голосов
/ 24 февраля 2009

Существует множество переменных среды, таких как:% USERPROFILE%,% HOMEPATH%,% APPDATA% - все эти точки указывают на некоторые пользовательские каталоги, куда вы можете поместить свои пользовательские файлы.

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

0 голосов
/ 24 февраля 2009

Извините, я не знаю правильного ответа, но ...

У вас есть экономическое обоснование для желания сделать это? Ваши клиенты жалуются, что файлы не хранятся там, где они ожидают? Ваши приложения каким-то образом повреждены, потому что вы храните файлы в нестандартных местах? Если нет, я не вижу причины тратить время и бюджет на переделку вашей стратегии хранения файлов, чтобы соответствовать «лучшей» практике. Если ваши программы просто работают, то ИМХО вы должны оставить их в покое и тратить деньги и время на важные вещи.

0 голосов
/ 24 февраля 2009

В каталоге c: \ users есть структура каталогов для пользовательских данных.

Существует документация по переносу приложений из старых ОС Windows в Vista.

Проверьте http://www.innovateon.com и перейдите по ссылкам на Vista. Существует документация по сертификации, в которой есть подробности по таким темам.

0 голосов
/ 24 февраля 2009

У нас есть похожее приложение, созданное ~ 10 лет назад с использованием MFC. Самым простым способом было создать папку прямо из C: \ (например, C: \ OurApp). Никаких установочных файлов, никаких специальных разрешений, никаких изменений в реестре и т. Д. Клиенты (и особенно их системные администраторы) ЛЮБЯТ это.

Еще одно соображение - планируете ли вы внезапно изменить папку установки для существующих клиентов (при условии, что она установлена ​​во многих местах)? Если что-то не сломано, зачем это чинить?

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