Qt的QFile_Size实现调试

背景

c++ qt需要获取一系列日志的大小,不想和底层C接口打交道,同时想看看QT的实现,是如何完成的?

源码查看

首先通过qtcreator的帮助知道,QFile::size()是基类QFileDevice::size()实现,

然后找到Qt5.9.7的源码,qtbase\include\QtCore\qfiledevice.h, 索引到src/corelib/io/qfiledevice.h

然后到达src/corelib/io目录,搜索关键字::size(), 可以看到QFileDevice::size(),-> QFSFileEngine::size() -> QFSFileEnginePrivate::nativeSize() -> QFSFileEnginePrivate::doStat(QFileSystemMetaData::SizeAttribute) -> QFileSystemEngine::fillMetaData ->QT_STAT(nativeFilePath, &statBuffer)

->QStorageInfoPrivate::doStat() ->QStorageInfoPrivate::retrievePosixInfo()->EINTR_LOOP(result, QT_STATFS(QFile::encodeName(rootPath).constData(), &statfs_buf))->QT_STATFS -> define QT_STATFS ::statvfs

结论

QFile的size,使用也是stat接口获取文件信息,QStorageInfo获取的是整个盘符,主要的作用是获取剩余控件。最后发现如果只是获取文件的大小和剩余时间,使用QFileInfo类更合适

QFile::size是调用QIODevice::size, 使用QFileSystemEngine::fillMetaData获取文件大小
QFileInfo直接就是调用QFileSystemEngine::fillMetaData(QFileSystemMetaData::SizeAttribute),更直接

QIODevice类说明

QIODevice中实现了Qt中的所有I/O方法,其他用到IO的类如QFile、QBuffer、QTcpSocket,都是从这个类继承而来。
QIODevice是一个抽象类,必须继承后才能实例化,先open(QIoDevice::OpenMode), 然后再write,read读写,最后使用close关闭
QIODevice有两种读取方式:随机访问和顺序访问,随机访问是指可以调用seek移动到任意文职,调用pos查看当前位置;顺序访问则数据必须一个接一个访问QTcpSocket,QProcess是顺序访问。
QTcpSocket,收到readyRead()后调用bytesAvailable(),再read相应大小;当write时,butesToWrite可以知道有多少bytes等待写入

posted @ 2023-06-19 12:05  大有神的自我独白  阅读(274)  评论(0)    收藏  举报