2009-02-23 2 views
11

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

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

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


Edit: Для того, чтобы расширить на вопросы, которые люди спрашивали до сих пор:


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

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


Далее вопрос:


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

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

+1

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

ответ

15

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

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

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

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

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

+0

Я был на полпути, сказав почти то же самое, когда я загрузил этот ответ. +1 – Randolpho

+0

Видел ли я тебя раньше, рандольфо? –

+0

Возможно, я часто встречался там днем. Тем не менее, у меня переполнение стека под моей кожей. :) – Randolpho

6

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

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

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

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

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

+0

Nice идет с downvote. Позаботьтесь, чтобы объяснить рассуждения, если они есть? – mghie

+0

Несвязанный с любым downvoting, «Примечание. Что касается Windows Vista, эта функция является просто оболочкой для SHGetKnownFolderPath. Значение CSIDL переводится в ассоциированный KNOWNFOLDERID, а затем вызывается SHGetKnownFolderPath. Новые приложения должны использовать известную систему папок ...» – JMD

+0

Хороший вопрос, внесли поправки в мой ответ. –

-2

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

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

+0

Я думаю, что это именно тот шаблон, который он пытается исправить. – JMD

+0

SysAdmins в эти дни уже не так в восторге от этого. Поскольку у пользователей не будет прав, по умолчанию развертывание - это хлопот. –

+0

Без файлов установки, как пользователи удаляют его? Испытывали ли вы когда-либо тестирование и запуск вашего приложения с ограниченным пользователем XP или стандартным пользователем Vista? –

-1

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

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

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

+0

-1, он не определен как C: \. В моих многозагрузочных установках иногда он присваивался как J: \, например. Веселые времена. –

+0

На 99% компьютеров это c: \. Главное в этом: документация существует, которая рассказывает людям, как переносить в Vista, куда класть вещи и т. Д. Вот ссылка «ближе»: http://www.innovateon.com/pageLayout.aspx?pageID = VistaCertBuild Взгляните на требования doc. – sebastus

-1

К сожалению, я не знаю, правильный ответ, но ...

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

+0

Вы запускаете очень реальный риск того, что программа не запускается под учетными записями не-администратора в Vista и более поздних версиях Windows. Это может быть смертельный приговор для приложения в корпоративной среде. – mghie

+0

А, хорошо знать. Благодарю. Таким образом, это означает, что его приложения могут быть каким-то образом искалечены, и у него действительно есть действующее дело. –

9

Некоторые рекомендации содержатся в этой статье базы знаний: How to write a Windows XP Application that stores user and application data in the correct location by using Visual C++. Кроме того, если вы ищете MSDN для Windows Logo Program, вы найдете документацию о том, что приложение должно делать, чтобы быть действительно совместимым.

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

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

+0

FYI, я оставил комментарий с ответом mghie, что MSFT говорит, что SHGetFolderPath устарел в пользу SHGetKnownFolderPath. – JMD

+0

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

0

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

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

2

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

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

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

+0

Полезная ссылка для белой бумаги - спасибо! – Colen