QFile与QFileInfo
- QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;
- QFlie:访问本地文件或者嵌入资源;
- QTemporaryFile:创建和访问本地文件系统的临时文件;
- QFileDevice:Qt5类,提供了有关文件操作的通用实现。
这其中,QProcess、QTcpSocket、QUdpSoctet和QSslSocket是顺序访问设备。所谓“顺序访问”,是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节;QFile、QTemporaryFile和QBuffer是随机访问设备,可以访问任意位置任意次数,还可以使用QIODevice::seek()函数来重新定位文件访问位置指针。
QFile file("in.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "Open file failed.";
return -1;
} else {
while (!file.atEnd()) {
qDebug() << file.readLine();
}
}
QFileInfo info(file);
qDebug() << info.isDir();
qDebug() << info.isExecutable();
qDebug() << info.baseName();
qDebug() << info.completeBaseName();
qDebug() << info.suffix();
qDebug() << info.completeSuffix();
QFileInfo fi("/tmp/archive.tar.gz");
QString base = fi.baseName(); // base = "archive"
QString cbase = fi.completeBaseName(); // cbase = "archive.tar"
QString ext = fi.suffix(); // ext = "gz"
QString ext = fi.completeSuffix(); // ext = "tar.gz"
QDataStream
QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)
QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << QString("the answer is");
out << (qint32)42;
file.close();
QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
QString str;
qint32 a;
in >> str >> a;
//保证Qt的版本一致,指定版本和魔术字
// 写入魔术数字和版本
out << (quint32)0xA0B0C0D0;
out << (qint32)123;
out.setVersion(QDataStream::Qt_4_0);
常用功能:
#程序路径
qDebug() << QGuiApplication::applicationDirPath();
qDebug() << QGuiApplication::applicationFilePath();
qDebug() << QDir::currentPath();
//输出
"C:/wmm/zyb/Z03/build-Z03-Desktop_Qt_5_14_2_MSVC2017_64bit-Debug/debug"
"C:/wmm/zyb/Z03/build-Z03-Desktop_Qt_5_14_2_MSVC2017_64bit-Debug/debug/Z03.exe"
"C:/wmm/zyb/Z03/build-Z03-Desktop_Qt_5_14_2_MSVC2017_64bit-Debug"
#文件夹内文件排序
QStringList LocalCacheData::initCacheData(const QString &path)
{
m_dataList.clear();
if(!path.isEmpty())
m_curDirPath = path;
QDir dir(m_curDirPath);
if(!dir.exists())
{
return QStringList();
}
dir.setFilter(QDir::Files | QDir::NoSymLinks);
QFileInfoList list =dir.entryInfoList();
for(int i=0; i < list.count(); i++)
{
QFileInfo file_info = list.at(i);
QString suffix = file_info.suffix();
if(QString::compare(suffix, QString("jpg"),Qt::CaseInsensitive) == 0)
{
QString absolute_file_path= file_info.absoluteFilePath();
m_dataList.append( absolute_file_path);
}
}
QCollator collator;
collator.setNumericMode(true);
std::sort(m_dataList.begin(), m_dataList.end(),
[& collator](const QString & str1, const QString & str2)
{
return collator.compare(str1, str2) > 0;
}
);
return m_dataList;
}
#删除文件
void removeLocalFile(const QString &path)
{
QFile tmp(path);
tmp.remove();
}
#判断文件是否存在
bool existImg(const QString &path)
{
QFileInfo file(path);
return file.exists();
}
#创建文件夹
void creatDir(const QString &path)
{
QDir dir;
if(!dir.exists(path)){
bool b = dir.mkdir(path);
qDebug() << "creat Dir "<<path << "res= " << b;
}
}
#创建多级文件夹
QString LocalCacheData::creatMutiDir(const QString &path)
{
QDir dir(path);
if ( dir.exists(path)){
return path;
}
QString parentDir = creatMutiDir(path.mid(0,path.lastIndexOf('/')));
QString dirname = path.mid(path.lastIndexOf('/') + 1);
QDir parentPath(parentDir);
if ( !dirname.isEmpty() )
parentPath.mkpath(dirname);
return parentDir + "/" + dirname;
}
#创建文本文件
void creatFile(const QString &path)
{
QFile file(path);
if(!file.exists())
{
if(file.open(QIODevice::WriteOnly |QIODevice::Text )){
}
else {
qDebug() << "creatFile failed" << path;
}
file.close();
}
}
#删除文件夹内所有文件
void clearDir(const QString &dir)
{
const QFileInfoList entries = QDir(dir).entryInfoList(QDir::AllEntries | QDir::Hidden);
foreach (const QFileInfo &fi, entries) {
if (fi.isSymLink() || fi.isFile()) {
QFile f(fi.filePath());
if (!f.remove()) {
const QString errorMessage = QCoreApplication::translate("QInstaller",
"Cannot remove file \"%1\": %2").arg(
QDir::toNativeSeparators(f.fileName()), f.errorString());
qWarning()<< errorMessage;
}
}
}
}