Где сохранить данные приложения в Windows?

#windows #pyqt #software-design #application-data

#Windows #pyqt #программное обеспечение-дизайн #приложение-данные

Вопрос:

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

Итак, я разобрался с проблемой. Windows не позволяет изменять файлы внутри C:Program Файлы. Итак, я установил его на другой диск, и он работает. Это временно решило мою проблему, но я хочу знать, как работает другое приложение в Windows.

Где эти приложения сохраняют свои данные? Я не говорю о некоторых данных, которые сохраняются в «Документах», но о чем-то, что необходимо изменять каждый раз, когда пользователь вносит изменения, такие как тема, форматирование.

Ответ №1:

Доступ пользователя к «папке программы» запрещен, и это хорошо: это системная папка, и к ней следует обращаться только для операций, связанных с системой (например, для установки или удаления программы).

Существует много мест, где «данные программы» могут храниться в зависимости от ситуации, и QStandardPaths предоставляет доступ к их путям в соответствии с расположением категории. Что вас может заинтересовать, так это:

  • ConfigLocation : Возвращает расположение каталога, в который должны быть записаны пользовательские конфигурационные файлы. Это может быть либо общее значение, либо специфичное для конкретного приложения, и возвращаемый путь никогда не бывает пустым.
  • AppDataLocation : Возвращает расположение каталога, в котором могут храниться постоянные данные приложения. Это каталог для конкретного приложения.
  • AppLocalDataLocation : Как и предыдущий, но специфичный для Windows.
  • AppConfigLocation : Возвращает расположение каталога, в который должны быть записаны пользовательские конфигурационные файлы. Это каталог для конкретного приложения, и возвращаемый путь никогда не бывает пустым.

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

  • standardLocations(locationType) : возвращает список путей для запрошенного типа местоположения в порядке приоритета (первый обычно является предпочтительным);
  • writableLocation(locationType) : возвращает предпочтительный путь, для которого разрешен доступ на запись (обычно первый из standardLocations() );

Если вам нужно сохранить конфигурацию пользователя, вы можете использовать QStandardPaths.writableLocation(AppConfigLocation) , в то время как если у вас есть какие-то специфические для пользователя внутренние данные, которые используются приложением (база данных электронной почты, шаблоны документов и т.д.) QStandardPaths.writableLocation(AppLocalDataLocation) , Это должно быть хорошим выбором.

В обоих случаях эти пути могут не существовать, поэтому вам необходимо убедиться в этом и в конечном итоге создать их, возможно, с помощью QDir(path) :

     dataPath = QtCore.QStandardPaths.writableLocation(AppLocalDataLocation)
    dataPathDir = QtCore.QDir(dataPath)
    if not dataPathDir.exists():
        # create the directory (including parent directories if they don't exist);
        # that the argument of mkpath is relative to the QDir's object path, so
        # using '.' means that it will create the actual dataPath
        dataPathDir.mkpath('.')
 

Обратите внимание, что для всего вышеперечисленного (особенно для последних 3) требуется, чтобы вы правильно установили как имя организации, так и имя приложения.