在一个应用中,往往需要保存一些临时数据,配置信息等等。例如,一个应用程序需要将下载好的文件保存在本地系统的某个地方,但是它不能确定指定磁盘上某个路径,因为这个路径可能在使用的系统上并不存在。又不期望应用程序将数据存放在工作目录中。这时候,使用系统提供的标准路径就是一个很好的选择,比如下载文件就可以存放在标准路径的" downloads"目录下。
在Qt中,QStandardPaths类提供了在不同系统下使用标准路径的统一方法,它可以非常方便地实现应用在存储临时数据和配置信息等功能。
QStandardPaths简介
QStandardPaths类提供了用于访问标准路径的方法。它包含用于查询本地文件系统上标准位置的函数,以执行常见任务,例如用户特定的目录或系统范围的配置目录。
枚举量QStandardPaths.LocateOption可用于控制QStandardPaths对是否只返回文件或者目录。
- QStandardPaths.LocateFile (0x0): 只返回文件。
- QStandardPaths.LocateDirectory (0x1): 只返回目录。
枚举量QStandardPaths.StandardLocation 用于控制查询各种不同的标准路径。该枚举中的一些值用于表示用户配置,这些枚举值会在不同的应用中返回相同的路径,因此它们可用于与其他应用程序共享数据。
- QStandardPaths.DesktopLocation (0): 返回用户的桌面目录。这是一个通用值。在没有桌面概念的系统上, 它与QStandardPaths.HomeLocation相同。
- QStandardPaths.DocumentsLocation (1): 返回包含用户文档文件的目录。这是一个通用值。返回的路径永远不会为空。
- QStandardPaths.FontsLocation (2): 返回包含用户字体的目录。这是一个通用值。注意,安装字体可能需要其他与平台相关的操作。
- QStandardPaths.ApplicationsLocation (3): 返回包含用户应用程序的目录(可执行文件,应用程序包或它们的快捷方式)。这是一个通用值。注意,安装应用程序可能需要其他与平台相关的操作。此目录中的文件,文件夹或快捷方式是与平台相关的。
- QStandardPaths.MusicLocation (4): 返回包含用户音乐或其他音频文件的目录。这是一个通用值。如果不存在特定的音乐文件目录,则返回用于存储用户文档的路径。
- QStandardPaths.MoviesLocation (5): 返回包含用户的电影和视频的目录。这是一个通用值。如果不存在特定于电影文件的目录,则返回用于存储用户文档的路径。
- QStandardPaths.PicturesLocation (6): 返回包含用户图片或照片的目录。这是一个通用值。如果不存在特定于图片文件的目录,则返回用于存储用户文档的路径。
- QStandardPaths.TempLocation (7): 返回可以存储临时文件的目录。返回的值可能是与应用程序相关的的,用户可以在其他应用程序之间甚至可能是系统范围共享存储在这个路径中的数据。返回的路径永远不会为空。
- QStandardPaths.HomeLocation (8): 返回用户的主目录(与QDir.homePath()相同)。在Unix系统上,它等于HOME环境变量。该值可能是通用值,也可能是与应用程序相关的值,但是返回的路径永远不会为空。
- QStandardPaths.DataLocation (9): 返回与AppLocalDataLocation相同的值。不建议使用此枚举值。最好使用AppDataLocation,因为在Windows上建议使用漫游路径(romaing path)。
- QStandardPaths.CacheLocation (10): 返回应在其中写入用户特定的非必需(缓存)数据的目录位置。这是一个和应用程序相关的目录。返回的路径永远不会为空。
- QStandardPaths.GenericCacheLocation (15): 返回应在该位置写入跨应用程序共享的用户特定的非必需(缓存)数据目录位置。这是一个通用值。请注意,如果系统没有共享缓存的概念,则返回的路径可能为空。
- QStandardPaths.GenericDataLocation (11): 返回一个可以存储跨应用程序共享的持久数据的目录位置。这是一个通用值。返回的路径永远不会为空。
- QStandardPaths.RuntimeLocation (12). 返回应该写入运行时通信文件的目录位置,例如Unix本地套接字。这是一个通用值。在某些系统上,返回的路径可能为空。
- QStandardPaths::ConfigLocation (13): 返回应在其中写入用户特定配置文件的目录位置。这可以是通用值,也可以是与应用程序相关的,并且返回的路径永远不会为空。
- QStandardPaths::DownloadLocation (14): 返回用户下载文件的目录。这是一个通用值。如果不存在特定的下载目录,则返回用于存储用户文档的路径。
- QStandardPaths::GenericConfigLocation (16): 返回一个目录位置,在该位置应写入多个应用程序之间共享的用户特定的配置文件。这是一个通用值,返回的路径永远不会为空。
- QStandardPaths.AppDataLocation (17): 返回可以存储持久性应用程序数据的目录位置。这是一个特定于应用程序的目录。若要获取存储与其他应用程序共享的数据的路径,请使用QStandardPaths.GenericDataLocation。返回的路径永远不会为空。在Windows操作系统上,将返回漫游路径。这个枚举值是在Qt 5.4中添加的。
- QStandardPaths.AppLocalDataLocation (DataLocation): 返回Windows操作系统上的本地设置路径。在所有其他平台上,它返回与AppDataLocation相同的值。这个枚举值是在Qt 5.4中添加的。
- QStandardPaths.AppConfigLocation (18): 返回应在其中写入用户特定配置文件的目录位置。这是一个与应用程序相关的目录,并且返回的路径永远不会为空。这个枚举值是在Qt 5.5中添加的。
不同系统下的标准路径
在不同的系统下,各标准路径对应值大致如下:
Windows系统下:
DesktopLocation: "C:/Users/<USER>/Desktop"
DocumentsLocation: "C:/Users/<USER>/Documents"
FontsLocation: "C:/Windows/Fonts" (不可写)
ApplicationsLocation: "C:/Users/<USER>/AppData/Roaming/Microsoft/Windows/Start Menu/Programs"
MusicLocation: "C:/Users/<USER>/Music"
MoviesLocation: "C:/Users/<USER>/Videos"
PicturesLocation: "C:/Users/<USER>/Pictures"
TempLocation: "C:/Users/<USER>/AppData/Local/Temp"
HomeLocation: "C:/Users/<USER>"
DataLocation: "C:/Users/<USER>/AppData/Local/<APPNAME>", "C:/ProgramData/<APPNAME>", "<APPDIR>", "<APPDIR>/data", "<APPDIR>/data/<APPNAME>"
CacheLocation: "C:/Users/<USER>/AppData/Local/<APPNAME>/cache"
GenericDataLocation: "C:/Users/<USER>/AppData/Local", "C:/ProgramData", "<APPDIR>", "<APPDIR>/data"
RuntimeLocation: "C:/Users/<USER>"
ConfigLocation: "C:/Users/<USER>/AppData/Local/<APPNAME>", "C:/ProgramData/<APPNAME>"
GenericConfigLocation: "C:/Users/<USER>/AppData/Local", "C:/ProgramData"
DownloadLocation: "C:/Users/<USER>/Documents"
GenericCacheLocation: "C:/Users/<USER>/AppData/Local/cache"
AppDataLocation: "C:/Users/<USER>/AppData/Roaming/<APPNAME>", "C:/ProgramData/<APPNAME>", "<APPDIR>", "<APPDIR>/data", "<APPDIR>/data/<APPNAME>"
AppLocalDataLocation: "C:/Users/<USER>/AppData/Local/<APPNAME>", "C:/ProgramData/<APPNAME>", "<APPDIR>", "<APPDIR>/data", "<APPDIR>/data/<APPNAME>"
AppConfigLocation: "C:/Users/<USER>/AppData/Local/<APPNAME>", "C:/ProgramData/<APPNAME>"
Linux系统下:
DesktopLocation: "~/Desktop"
DocumentsLocation: "~/Documents"
FontsLocation: "~/.fonts", "~/.local/share/fonts", "/usr/local/share/fonts", "/usr/share/fonts"
ApplicationsLocation: "~/.local/share/applications", "/usr/local/share/applications", "/usr/share/applications"
MusicLocation: "~/Music"
MoviesLocation: "~/Videos"
PicturesLocation: "~/Pictures"
TempLocation: "/tmp"
HomeLocation: "~"
DataLocation: "~/.local/share/<APPNAME>", "/usr/local/share/<APPNAME>", "/usr/share/<APPNAME>"
CacheLocation: "~/.cache/<APPNAME>"
GenericDataLocation: "~/.local/share", "/usr/local/share", "/usr/share"
RuntimeLocation: "/run/user/<USER>"
ConfigLocation: "~/.config", "/etc/xdg"
GenericConfigLocation: "~/.config", "/etc/xdg"
DownloadLocation: "~/Downloads"
GenericCacheLocation: "~/.cache"
AppDataLocation: "~/.local/share/<APPNAME>", "/usr/local/share/<APPNAME>", "/usr/share/<APPNAME>"
AppLocalDataLocation: "~/.local/share/<APPNAME>", "/usr/local/share/<APPNAME>", "/usr/share/<APPNAME>"
AppConfigLocation: "~/.config/<APPNAME>", "/etc/xdg/<APPNAME>"
macOS系统下:
DesktopLocation: "~/Desktop"
DocumentsLocation: "~/Documents"
FontsLocation: "/System/Library/Fonts" (不可写入)
ApplicationsLocation: "/Applications" (不可写入)
MusicLocation: "~/Music"
MoviesLocation: "~/Movies"
PicturesLocation: "~/Pictures"
TempLocation: 由系统随机生成
HomeLocation: "~"
DataLocation: "~/Library/Application Support/<APPNAME>", "/Library/Application Support/<APPNAME>". "<APPDIR>/../Resources"
CacheLocation: "~/Library/Caches/<APPNAME>", "/Library/Caches/<APPNAME>"
GenericDataLocation: "~/Library/Application Support", "/Library/Application Support"
RuntimeLocation: "~/Library/Application Support"
ConfigLocation: "~/Library/Preferences"
GenericConfigLocation: "~/Library/Preferences"
DownloadLocation: "~/Downloads"
GenericCacheLocation: "~/Library/Caches", "/Library/Caches"
AppDataLocation: "~/Library/Application Support/<APPNAME>", "/Library/Application Support/<APPNAME>". "<APPDIR>/../Resources"
AppLocalDataLocation: "~/Library/Application Support/<APPNAME>", "/Library/Application Support/<APPNAME>". "<APPDIR>/../Resources"
AppConfigLocation:"~/Library/Preferences/<APPNAME>"
QStandardPaths常用函数
- findExecutable(executableName, paths):在指定的路径中查找名为executableName的可执行文件,如果paths为空,则在系统路径中查找。 系统路径指PATH环境变量的值。 如果存在,返回可执行文件的绝对文件路径,如果没有找到,则返回空字符串。
- displayName(type: 'QStandardPaths.StandardLocation'):根据标准目录类型,返回对应的本地名称,如果找不到,返回空字符串。 例如指定type为DesktopLocation,则返回桌面名称;DocumentsLocation,则返回文档目录名称。
- locate(type, str, options):根据标准目录类型,在该目录中查找名为fileName的文件或目录。 返回找到的第一个文件或目录的完整路径(取决于options)。 如果找不到这样的文件或目录,则返回一个空字符串。如果某一种类型的系统标准目录可能会有多个路径,因此,系统会按照顺序查找这些路径中的文件或目录。 例如QStandardPaths.DataLocation,数据文件类型目录就有多个路径与之对应。函数会依次查询standardLocations接口返回的路径列表中所匹配的文件。
- locateAll(type, str, options):同locate接口,但这里返回的是所有符合条件的文件或目录。
- standardLocations(type):根据标准目录类型,返回该类型的所属的所有目录路径。 如果可以确定的话,目录列表从高优先级到低优先级排序。 如果type没有定义,则此列表为空。
- writableLocation(type):根据标准目录类型,返回文件可写入的目录;如果无法确定位置,则返回空字符串。
测试
测试例子演示了系统中可写标准路径(注意,在不同的系统下有不一样的路径设置)。完整代码如下:
import sys
from PyQt5.QtCore import QStandardPaths
from PyQt5.QtWidgets import QApplication
if __name__ == '__main__':
app = QApplication(sys.argv)
print('Qt for Python: QStandardPaths 演示\n')
print('DesktopLocation: '+ QStandardPaths.writableLocation(QStandardPaths.DesktopLocation))
print('DocumentsLocation: '+ QStandardPaths.writableLocation(QStandardPaths.DocumentsLocation))
print('FontsLocation: '+ QStandardPaths.writableLocation(QStandardPaths.FontsLocation))
print('ApplicationsLocation: '+ QStandardPaths.writableLocation(QStandardPaths.ApplicationsLocation))
print('MusicLocation: '+ QStandardPaths.writableLocation(QStandardPaths.MusicLocation))
print('MoviesLocation: '+ QStandardPaths.writableLocation(QStandardPaths.MoviesLocation))
print('PicturesLocation: '+ QStandardPaths.writableLocation(QStandardPaths.PicturesLocation))
print('TempLocation: '+ QStandardPaths.writableLocation(QStandardPaths.TempLocation))
print('HomeLocation: '+ QStandardPaths.writableLocation(QStandardPaths.HomeLocation))
print('DataLocation: '+ QStandardPaths.writableLocation(QStandardPaths.DataLocation))
print('CacheLocation: '+ QStandardPaths.writableLocation(QStandardPaths.CacheLocation))
print('GenericDataLocation: '+ QStandardPaths.writableLocation(QStandardPaths.GenericDataLocation))
print('RuntimeLocation: '+ QStandardPaths.writableLocation(QStandardPaths.RuntimeLocation))
print('ConfigLocation: '+ QStandardPaths.writableLocation(QStandardPaths.ConfigLocation))
print('DownloadLocation: '+ QStandardPaths.writableLocation(QStandardPaths.DownloadLocation))
print('GenericCacheLocation: '+ QStandardPaths.writableLocation(QStandardPaths.GenericCacheLocation))
print('GenericConfigLocation: '+ QStandardPaths.writableLocation(QStandardPaths.GenericConfigLocation))
print('AppDataLocation: '+ QStandardPaths.writableLocation(QStandardPaths.AppDataLocation))
print('AppConfigLocation: '+ QStandardPaths.writableLocation(QStandardPaths.AppConfigLocation))
print('AppLocalDataLocation: '+ QStandardPaths.writableLocation(QStandardPaths.AppLocalDataLocation))
sys.exit(app.exec())
运行结果如下图:
QStandardPaths标准路径演示
本文知识点
- 不同系统的标准路径。
- 使用QStandardPaths得到系统的标准路径。