Подтвердить что ты не робот

Где моя программа win32 сохранит свои файлы?

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

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

Есть ли ссылка где-то где идет?


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


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

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


Дальнейший вопрос:


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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Используйте функцию

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

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

Ответ 4

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

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

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

Ответ 5

Есть много переменных среды, таких как:% USERPROFILE%,% HOMEPATH%,% APPDATA% всех этих точек в некоторых каталогах, специфичных для пользователя, где вы можете поместить свои пользовательские файлы.

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

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

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