【小沐学QT】QT学习之路径问题汇总

9 篇文章 2 订阅
本文详细介绍了在Qt中使用QDir、QFile、QFileInfo、QFileSystemWatcher等类进行路径操作,包括程序路径、用户目录、文件读写、配置文件管理,以及C++和C#中类似操作的对比。
摘要由CSDN通过智能技术生成

1、简介

在这里插入图片描述

1.1 QDir

https://doc.qt.io/qt-5/qdir.html
QDir 用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。

QDir("/home/user/Documents")
QDir("C:/Users")
QDir("images/landscape.png")

1.2 QFile

https://doc.qt.io/qt-5/qfile.html
QFile 是一个 I/O 设备,用于读取和写入文本和二进制文件以及 .QFile 可以单独使用,也可以更方便地与 或 一起使用 。

 QFile file("in.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;

    while (!file.atEnd()) {
        QByteArray line = file.readLine();
        process_line(line);
    }

1.3 QFileInfo

https://doc.qt.io/qt-5/qfileinfo.html
QFileInfo 提供有关文件的名称和在文件系统中的位置(路径)、其访问权限以及它是目录还是符号链接等的信息。文件的大小和上次修改/读取时间也可用。QFileInfo 还可用于获取有关 Qt 的信息。

#ifdef Q_OS_WIN

QFileInfo info1("C:\\Users\\Bob\\untabify.lnk");
info1.isSymLink();          // returns true
info1.absoluteFilePath();   // returns "C:/Users/Bob/untabify.lnk"
info1.size();               // returns 63942
info1.symLinkTarget();      // returns "C:/Pretty++/untabify"

QFileInfo info2(info1.symLinkTarget());
info2.isSymLink();          // returns false
info2.absoluteFilePath();   // returns "C:/Pretty++/untabify"
info2.size();               // returns 63942

#endif
QString path     = QDir::cleanPath(QString("C:/QtProject/filepath/") + QDir::separator() + QString("/xiaomu.txt"));
QString fileName = QFileInfo(path).fileName();

1.4 QFileSystemWatcher

https://doc.qt.io/qt-5/qfilesystemwatcher.html
QFileSystemWatcher 类提供了一个接口,用于监视文件和目录以进行修改。

QFileSystemWatcher *watcher = new QFileSystemWatcher();
watcher->addPath(localPath); // 监听本地路径变化
QObject::connect(watcher, &QFileSystemWatcher::fileChanged, [=](const QString& path) {
    QString cloudFilePath = cloudPath + "/" + QFileInfo(path).fileName();
    uploadFile(path, cloudFilePath); // 上传文件
});

2、Qt各种路径

2.1 程序所在路径

使用函数:

QString QCoreApplication::applicationDirPath();

测试如下:

#include <QCoreApplication>
#include <QDebug>
#include <QDir>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "爱看书的小沐";
    qDebug() << QCoreApplication::applicationDirPath();

    return a.exec();
}

在这里插入图片描述

2.2 程序的全路径

使用函数:

QString QCoreApplication::applicationFilePath();

测试如下:

#include <QCoreApplication>
#include <QDebug>
#include <QDir>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "爱看书的小沐";
    qDebug() << QCoreApplication::applicationFilePath();

    return a.exec();
}

在这里插入图片描述

2.3 当前工作目录

使用函数:

QString QDir::currentPath()

测试如下:

#include <QCoreApplication>
#include <QDebug>
#include <QDir>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "爱看书的小沐";
    qDebug() << QDir::currentPath();

    return a.exec();
}

在这里插入图片描述

  • 设置当前目录
QDir::setCurrent("/home/user/myapp");

2.4 用户目录路径

Qt 5 中引入的方法:

static QString QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
static QStringList QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
static QString QDir::homePath();

测试如下:

#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QStandardPaths>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "爱看书的小沐";
    qDebug() << QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
    qDebug() << QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
    qDebug() << QDir::homePath();

    return a.exec();
}

在这里插入图片描述

2.5 我的文档路径

Qt 5 中引入的方法:

QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation);

测试如下:

#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QStandardPaths>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "爱看书的小沐";
    qDebug() << QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
    qDebug() << QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation);

    return a.exec();
}

在这里插入图片描述

2.6 桌面路径

Qt 5 中引入的方法:

QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
QStandardPaths::standardLocations(QStandardPaths::DesktopLocation);

测试如下:

#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QStandardPaths>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "爱看书的小沐";
    qDebug() << QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
    qDebug() << QStandardPaths::standardLocations(QStandardPaths::DesktopLocation);

    return a.exec();
}

在这里插入图片描述

2.7 程序数据存放路径

Qt 5 中引入的方法:

QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
QStandardPaths::standardLocations(QStandardPaths::AppDataLocation);

QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
QStandardPaths::standardLocations(QStandardPaths::AppConfigLocation);

测试如下:

#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QStandardPaths>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "爱看书的小沐";
    qDebug() << QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
    qDebug() << QStandardPaths::standardLocations(QStandardPaths::AppDataLocation);
    qDebug() << QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
    qDebug() << QStandardPaths::standardLocations(QStandardPaths::AppConfigLocation);
    return a.exec();
}

在这里插入图片描述

2.8 临时文件路径

Qt 5 中引入的方法:

QStandardPaths::writableLocation(QStandardPaths::TempLocation);
QStandardPaths::standardLocations(QStandardPaths::TempLocation);
QDir::tempPath();

测试如下:

#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QStandardPaths>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "爱看书的小沐";
    qDebug() << QStandardPaths::writableLocation(QStandardPaths::TempLocation);
    qDebug() << QStandardPaths::standardLocations(QStandardPaths::TempLocation);
    qDebug() << QDir::tempPath();
    return a.exec();
}

在这里插入图片描述

  • QTemporaryFile
    QTemporaryFile类是操作临时文件的I/O设备。
#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QTemporaryFile>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "爱看书的小沐";
    QTemporaryFile file;
    if (file.open()) {
        qDebug() << file.fileName();
    }
    return a.exec();
}

在这里插入图片描述

  • QTemporaryDir
#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QTemporaryDir>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "爱看书的小沐";
    QTemporaryDir dir;
    if (dir.isValid()) {
        qDebug() << dir.path();
    }
    return a.exec();
}

在这里插入图片描述

2.9 遍历文件

QDir localDir(localPath);
QStringList entries = localDir.entryList(QDir::Files);
foreach(QString file, entries) {
    QString localFilePath = localDir.absoluteFilePath(file);
    QString cloudFilePath = cloudPath + "/" + file;
    // 将localFilePath上传至cloudFilePath
    uploadFile(localFilePath, cloudFilePath);
}

2.10 路径封装类

class FilePath
{
public:
    static QString getAppPath()
    {
        return qApp->applicationDirPath();
    }

    static QString getAppFilePath()
    {
        return qApp->applicationFilePath(); 
    }

    static QString getCurrentPath()
    {
        return QDir::currentPath();
    }

    static QString getHomePath()
    {
        return QDir::homePath();
    }

    static QString getAppDataPath()
    {
        return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
    }
    
    static QString getTempPath()
    {
        return QStandardPaths::writableLocation(QStandardPaths::TempLocation);
    }
};

2.11 Qt读写文件(QFile)

  • 读文件
QFile file(absolutePath);
if (file.open(QIODevice::ReadOnly)) {
    // 读取文件内容
    QByteArray data = file.readAll();
    file.close();
}
  • 写文件
QFile file(relativePath);
if (file.open(QIODevice::WriteOnly)) {
    // 写入文件内容
    file.write("Hello, world!");
    file.close();

2.12 Qt读写文件(QTextStream)

使用QTextStream来读取文本文件

  • 读取文件
void readfile()
{
	QString path = QFileDialog::getOpenFileName(this, "open", "../", "txt(*.txt)");
	if (!path.isEmpty())
	{
		QFile file(path);
		bool isok = file.open(QIODevice::ReadOnly);
		if (isok)
		{
			QTextStream filestream(&file);//QTextStream 与file关联
			QString str;
			filestream.setCodec("UTF-8");
			while (filestream.atEnd()==false)
			{
				str.append(filestream.readLine());//逐行读取
				str.append("\n");
				//str = filestream.readAll();//一次性读取全部文件
			}
			ui.textBrowser->setText(str);
		}
		file.close();
	}
}
  • 写文件
void writefile()
{
	QString path = QFileDialog::getSaveFileName(this, "save", "../", "txt(*.txt)");
	if (!path.isEmpty())
	{
		QFile file(path);
		bool isok = file.open(QIODevice::WriteOnly);
		if (isok)
		{
			QTextStream filestream(&file);//QTextStream 与file关联
			QString str = ui.textBrowser->toPlainText();
			filestream << str;//写出文件
			qDebug() << str;
		}
		file.close();
	}
}

2.13 Qt读写文件(QDataStream)

使用QDataStream来读取二进制数据。QDataStream类实现了将QIODevice的二进制数据串行化。

  • 读文件
QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
QString str; qint32 a;
in >> str >> a;
  • 写文件
QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << QString("the answer is");
out << (qint32)42;

2.14 QSettings配置文件

QSettings能读写配置文件,当配置文件不存在时,可生成配置文件。


#include <QtCore/QtCore>
#include <QFile>
#include <QDebug>
#include <QTextCodec> 
 
void ConfigSetting(void)
{
    //文件路径+文件名
    QString fileName = QCoreApplication::applicationDirPath() + "/Config.ini";
    //创建配置目标,输入文件路径,文件格式
    QSettings *setting = new QSettings(fileName , QSettings::IniFormat);
    //设置文件编码,配置文件中使用中文时,这是必须的,否则乱码
    setting->setIniCodec(QTextCodec::codecForName("UTF-8"));
    // 判断文件是否存在
    if(QFile::exists(fileName))
    {// 文件存在,读出配置项
        // 这里的setting->value的第二参数,是配置项缺省值,即当读取的配置项不存在时,读取该值
        // User是配置组,name和age是配置项
        QString name = setting->value("User/name", "张三").toString();
        int age = setting->value("User/age", 30).toInt();
    }
    else {// 文件不存在,写入配置项,生成配置文件
        setting->setValue("User/name", "张三");
        setting->setValue("User/age", 30);
        // setValue只是把配置项写入了缓冲区,若要写入文件,还需执行同步
        // 不同步,无法写入文件,无法生成文件
        // 写入配置项后,必须同步才能写入文件
        setting->sync();
    }
}

3、C++各种路径

3.1 获取当前工作目录

#include <iostream>
#include <string>
#ifdef _WIN32
#include <io.h>
#include <direct.h>
#else
#include <unistd.h>
#endif

int main() {
    std::cout << "爱看书的小沐:" << std::endl;
    char currentPath[FILENAME_MAX];
    if (getcwd(currentPath, sizeof(currentPath)) != NULL) {
        std::cout << "Current working directory: " << currentPath << std::endl;
    } else {
        perror("getcwd() error");
        return 1;
    }
    return 0;
}

在这里插入图片描述

3.2 读取文件

#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::cout << "爱看书的小沐:" <<std::endl;
    std::string filePath = "d:/飞鸟集.txt";
    std::ifstream file(filePath);
    if (file.is_open()) {
        std::string line;
        while (std::getline(file, line)) {
            std::cout << line << std::endl;
        }
        file.close();
    } else {
        std::cerr << "Unable to open file: " << filePath << std::endl;
        return 1;
    }
    return 0;
}

在这里插入图片描述

3.3 写入文件

#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::cout << "爱看书的小沐:" <<std::endl;

    std::string filePath = "d:/飞鸟集.txt";
    std::ofstream file(filePath);
    if (file.is_open()) {
        file << "夏天的飞鸟,飞到我的窗前唱歌,又飞去了。" << std::endl;
        file.close();
        std::cout << "文件写入ok!" << std::endl;
    } else {
        std::cerr << "Unable to create file: " << filePath << std::endl;
        return 1;
    }
    return 0;
}

在这里插入图片描述
在这里插入图片描述

4、C#各种路径

4.1 获取当前工作目录

using System;
namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("爱看书的小沐:");
            string currentDirectory = Environment.CurrentDirectory;
            Console.WriteLine("Current working directory: " + currentDirectory);
        }
    }
}

在这里插入图片描述

4.2 读写文件

using System;
using System.IO;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("爱看书的小沐:");
            string filePath = @"C:\Users\tomcat\Desktop\飞鸟集.txt";

            // 读取文件内容
            string[] lines = File.ReadAllLines(filePath);
            foreach (string line in lines)
            {
                Console.WriteLine(line);
            }

            // 写入文件内容
            File.WriteAllText(filePath, "Hello, world!");
        }
    }
}

在这里插入图片描述

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值