#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) требуется, чтобы вы правильно установили как имя организации, так и имя приложения.