qt 如何获取磁盘信息、QStorageInfo

以往获取qt磁盘信息,笔者是通过一下API转换的

cpp 复制代码
BOOL GetDiskFreeSpaceExW(
  [in, optional]  LPCWSTR         lpDirectoryName,
  [out, optional] PULARGE_INTEGER lpFreeBytesAvailableToCaller,
  [out, optional] PULARGE_INTEGER lpTotalNumberOfBytes,
  [out, optional] PULARGE_INTEGER lpTotalNumberOfFreeBytes
);

一次偶然的机会发现QT其实已经提供了相关类QStorageInfo

详细说明

QStorageInfo提供有关当前安装的存储和驱动器的信息。

++允许检索有关卷的空间、挂载点、标签和文件系统名称的信息。++

可以通过将卷挂载点的路径作为构造函数参数传递来创建QStorageInfo的实例,也可以使用setPath()方法进行设置。静态挂载的卷 mountedVolumes()方法可用于获取所有挂载文件系统的列表。QStorageInfo总是缓存检索到的信息,可以调用refresh() 重置QStorageInfo的内部缓存。

以下示例打印有关它的信息。

cpp 复制代码
    QList<QStorageInfo> list; = QStorageInfo::mountedVolumes();
    for(auto var:list)
    {
        qDebug()<<"blockSize"<<":"<<var.blockSize();
        qDebug()<<"bytesAvailable"<<":"<<var.bytesAvailable()/1024/1024/1024<<"GB";
        qDebug()<<"bytesFree"<<":"<<var.bytesFree()/1024/1024/1024<<"GB";
        qDebug()<<"bytesTotal"<<":"<<var.bytesTotal()/1024/1024/1024<<"GB";
        qDebug()<<"device"<<":"<<var.device();
        qDebug()<<"displayName"<<":"<<var.displayName();
        qDebug()<<"fileSystemType"<<":"<<var.fileSystemType();
        qDebug()<<"isReadOnly"<<":"<<var.isReadOnly();
        qDebug()<<"isRoot"<<":"<<var.isRoot();
        qDebug()<<"isValid"<<":"<<var.isValid();
        qDebug()<<"name"<<":"<<var.name();
        qDebug()<<"rootPath"<<":"<<var.rootPath();
        qDebug()<<"*****************************";
    }

打印结果

bash 复制代码
blockSize : -1
bytesAvailable : 68 GB
bytesFree : 68 GB
bytesTotal : 146 GB
device : "\\\\?\\Volume{8406cabc-3eaa-4755-a85f-d9e977711c05}\\"
displayName : "Windows"
fileSystemType : "NTFS"
isReadOnly : false
isRoot : true
isValid : true
name : "Windows"
rootPath : "C:/"
*****************************
blockSize : -1
bytesAvailable : 209 GB
bytesFree : 209 GB
bytesTotal : 329 GB
device : "\\\\?\\Volume{84025fc9-a85f-445f-b128-36e702af5a5c}\\"
displayName : "Data"
fileSystemType : "NTFS"
isReadOnly : false
isRoot : false
isValid : true
name : "Data"
rootPath : "D:/"
*****************************

成员函数

cpp 复制代码
QStorageInfo::QStorageInfo()

使用默认构造函数创建的对象将无效,因此无法使用。

See also setPath(), isReady(), and isValid().

cpp 复制代码
QStorageInfo::QStorageInfo(const QString &path)

构造一个新的QStorageInfo对象,该对象提供有关安装在路径上的卷的信息。

如果传递目录文件QStorageInfo对象将引用此目录或文件所在的卷。您可以使用isValid()方法检查创建的对象是否正确。

以下示例显示了如何获取应用程序所在的卷。++建议始终检查卷是否已准备好且有效。++

cpp 复制代码
QStorageInfo var(qApp->applicationDirPath());
     if (var.isValid() && var.isReady()) {
         qDebug()<<"blockSize"<<":"<<var.blockSize();
         qDebug()<<"bytesAvailable"<<":"<<var.bytesAvailable()/1024/1024/1024<<"GB";
         qDebug()<<"bytesFree"<<":"<<var.bytesFree()/1024/1024/1024<<"GB";
         qDebug()<<"bytesTotal"<<":"<<var.bytesTotal()/1024/1024/1024<<"GB";
         qDebug()<<"device"<<":"<<var.device();
         qDebug()<<"displayName"<<":"<<var.displayName();
         qDebug()<<"fileSystemType"<<":"<<var.fileSystemType();
         qDebug()<<"isReadOnly"<<":"<<var.isReadOnly();
         qDebug()<<"isRoot"<<":"<<var.isRoot();
         qDebug()<<"isValid"<<":"<<var.isValid();
         qDebug()<<"name"<<":"<<var.name();
         qDebug()<<"rootPath"<<":"<<var.rootPath();
     }

打印结果

bash 复制代码
blockSize : -1
bytesAvailable : 209 GB
bytesFree : 209 GB
bytesTotal : 329 GB
device : "\\\\?\\Volume{84025fc9-a85f-445f-b128-36e702af5a5c}\\"
displayName : "Data"
fileSystemType : "NTFS"
isReadOnly : false
isRoot : false
isValid : true
name : "Data"
rootPath : "D:/"

See also setPath().

cpp 复制代码
QStorageInfo::QStorageInfo(const QDir &dir)

构造一个新的QStorageInfo对象,该对象提供有关包含dir文件夹的卷的信息。

cpp 复制代码
QStorageInfo::QStorageInfo(const QStorageInfo &other)

构造一个新的QStorageInfo对象,该对象是另一个QStorageInfo对象的副本。

cpp 复制代码
QStorageInfo::~QStorageInfo()

销毁QStorageInfo对象并释放其资源。

cpp 复制代码
int QStorageInfo::blockSize() const

返回此文件系统的最佳传输块大小。

如果QStorageInfo无法确定大小或QStorageInfo对象无效,则返回-1。

cpp 复制代码
qint64 QStorageInfo::bytesAvailable() const

返回当前用户可用的大小(以字节为单位)。如果用户是root用户或系统管理员,它返回可用的总大小。

此大小可以小于或等于bytesFree()函数返回的空闲大小。

如果QStorageInfo对象无效,则返回-1。

See also bytesTotal() and bytesFree().

cpp 复制代码
qint64 QStorageInfo::bytesFree() const

返回卷中的可用字节数。请注意,如果文件系统上有配额,则此值可以大于 bytesAvailable()返回的值。

See also bytesTotal() and bytesAvailable().

cpp 复制代码
qint64 QStorageInfo::bytesTotal() const

返回总体积大小(以字节为单位)。

See also bytesFree() and bytesAvailable().

cpp 复制代码
QByteArray QStorageInfo::device() const

返回此卷的设备。

例如,在Unix文件系统(包括macOS)上,它返回本地存储的开发路径,如/dev/sda0。在Windows上,它返回本地存储的以\\\\?\\开头的UNC路径(换句话说,卷GUID)。

See also rootPath()

cpp 复制代码
QString QStorageInfo::displayName() const

如果可用,则返回卷的名称,如果不可用,则返回根路径。

cpp 复制代码
QByteArray QStorageInfo::fileSystemType() const

返回文件系统的类型名称。

这是一个依赖于平台的函数,文件系统名称可能因不同的操作系统而异。例如,在Windows文件系统上,它们可以命名为NTFS,Linux它们可以命名为ntfs-3gfuseblk

See also name().

cpp 复制代码
bool QStorageInfo::isReadOnly() const

如果当前文件系统受到写入保护,则返回true;否则为假。

cpp 复制代码
bool QStorageInfo::isReady() const

如果当前文件系统已准备好工作,则返回true;否则为假。例如,如果未插入CD卷,则返回false。

请注意,fileSystemType()、name()、bytesTotal()、bytesFree()和bytesAvailable() 将返回无效数据,直到卷准备就绪。

See also isValid()

cpp 复制代码
bool QStorageInfo::isRoot() const

如果此QStorageInfo代表系统根卷,则返回true;否则为假。

在Unix文件系统上,根卷是安装在/上的卷。在Windows上,根卷是安装操作系统的卷。

See also root().

cpp 复制代码
bool QStorageInfo::isValid() const

如果rootPath指定的QStorageInfo存在并正确挂载,则返回true。

See also isReady().

cpp 复制代码
QList<QStorageInfo> QStorageInfo::mountedVolumes()

返回与当前挂载文件系统列表对应的QStorageInfo对象列表。

在Windows上,这会返回My Computer文件夹中可见的驱动器。在Unix操作系统上,它返回所有挂载文件系统的列表(伪文件系统除外)。

默认返回所有当前挂载的文件系统。

该示例显示了如何检索所有可用文件系统,跳过只读文件系统。

cpp 复制代码
foreach (const QStorageInfo &var, QStorageInfo::mountedVolumes()) {
            if (var.isValid() && var.isReady()) {
                if (!var.isReadOnly()) {
                    qDebug()<<"blockSize"<<":"<<var.blockSize();
                    qDebug()<<"bytesAvailable"<<":"<<var.bytesAvailable()/1024/1024/1024<<"GB";
                    qDebug()<<"bytesFree"<<":"<<var.bytesFree()/1024/1024/1024<<"GB";
                    qDebug()<<"bytesTotal"<<":"<<var.bytesTotal()/1024/1024/1024<<"GB";
                    qDebug()<<"device"<<":"<<var.device();
                    qDebug()<<"displayName"<<":"<<var.displayName();
                    qDebug()<<"fileSystemType"<<":"<<var.fileSystemType();
                    qDebug()<<"isReadOnly"<<":"<<var.isReadOnly();
                    qDebug()<<"isRoot"<<":"<<var.isRoot();
                    qDebug()<<"isValid"<<":"<<var.isValid();
                    qDebug()<<"name"<<":"<<var.name();
                    qDebug()<<"rootPath"<<":"<<var.rootPath();
                }
            }
        }

打印结果

bash 复制代码
blockSize : -1
bytesAvailable : 68 GB
bytesFree : 68 GB
bytesTotal : 146 GB
device : "\\\\?\\Volume{8406cabc-3eaa-4755-a85f-d9e977711c05}\\"
displayName : "Windows"
fileSystemType : "NTFS"
isReadOnly : false
isRoot : true
isValid : true
name : "Windows"
rootPath : "C:/"
blockSize : -1
bytesAvailable : 209 GB
bytesFree : 209 GB
bytesTotal : 329 GB
device : "\\\\?\\Volume{84025fc9-a85f-445f-b128-36e702af5a5c}\\"
displayName : "Data"
fileSystemType : "NTFS"
isReadOnly : false
isRoot : false
isValid : true
name : "Data"
rootPath : "D:/"

See also root().

cpp 复制代码
QString QStorageInfo::name() const

返回文件系统的人类可读名称,通常称为label

并非所有文件系统都支持此功能。在这种情况下,此方法返回的值可能为空。如果文件系统不支持标签,或者没有设置标签,则返回一个空字符串。

在Linux,检索卷的标签需要udev出现在系统中。

See also fileSystemType().

cpp 复制代码
void QStorageInfo::refresh()

重置QStorageInfo的内部缓存。

QStorageInfo缓存有关存储的信息以提高性能。QStorageInfo在对象构造期间和/或调用setPath()方法时检索信息。您必须通过调用此函数来手动重置缓存以更新存储信息。

cpp 复制代码
QStorageInfo QStorageInfo::root()

返回一个QStorageInfo对象,该对象表示系统根卷。

在Unix系统上,此调用返回根 ('/') 卷;在Windows中,则返回安装操作系统的卷。

See also isRoot().

cpp 复制代码
QString QStorageInfo::rootPath() const

返回此QStorageInfo对象表示的文件系统的挂载点。

在Windows上,如果卷未挂载到目录,它会返回卷号。

请注意,rootPath()返回的值是一个卷的真正挂载点,可能不等于传递给构造函数或setPath()方法的值。例如,如果您在系统中只有根卷,并将'/directory'传递给setPath(),则此方法将返回'/'。

See also setPath() and device().

cpp 复制代码
void QStorageInfo::setPath(const QString &path)

将此QStorageInfo对象设置为安装在path所在位置的文件系统。

path可以是文件系统的根路径目录或该文件系统中的文件

See also rootPath().

cpp 复制代码
void QStorageInfo::swap(QStorageInfo &other)

将此卷信息与其他卷信息交换。此功能非常快,永远不会失败。

cpp 复制代码
QStorageInfo &QStorageInfo::operator=(const QStorageInfo &other)

制作QStorageInfo对象的副本并将其分配给此QStorageInfo对象。

cpp 复制代码
QStorageInfo &QStorageInfo::operator=(QStorageInfo &&other)

将其他分配给此QStorageInfo实例。

相关非成员函数

cpp 复制代码
bool operator!=(const QStorageInfo &first, const QStorageInfo &second)

如果第一个QStorageInfo对象引用的驱动器或卷与第二个不同,则返回true;否则返回false

cpp 复制代码
bool operator==(const QStorageInfo &first, const QStorageInfo &second)

如果第一个QStorageInfo对象引用与第二个相同的驱动器或卷,则返回true;否则返回false。

请注意,比较两个无效的QStorageInfo对象的结果始终为正。

相关推荐
沐泽Mu1 小时前
嵌入式学习-QT-Day07
c++·qt·学习·命令模式
沐泽Mu1 小时前
嵌入式学习-QT-Day09
开发语言·qt·学习
林浔09066 小时前
QT信号槽
开发语言·qt
kiiila6 小时前
【Qt】编辑框/按钮控件---实现HelloWorld
开发语言·qt
lw向北.12 小时前
Qt For Android之环境搭建(Qt 5.12.11 Qt下载SDK的处理方案)
android·开发语言·qt
小灰灰搞电子13 小时前
Qt实现Android的图案密码(图形解锁)源码分享
开发语言·qt
kiiila1 天前
【Qt】对象树(生命周期管理)和字符集(cout打印乱码问题)
开发语言·qt
黄金右肾1 天前
Qt之数据库使用(十四)
sql·qt·sqlite·database
杨德杰1 天前
QT多媒体开发(一):概述
qt·音视频·多媒体
小王爱吃月亮糖1 天前
QT开发【常用控件1】-Layouts & Spacers
开发语言·前端·c++·qt·visual studio