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

文章目录

  • 1、简介
    • [1.1 QDir](#1.1 QDir)
    • [1.2 QFile](#1.2 QFile)
    • [1.3 QFileInfo](#1.3 QFileInfo)
    • [1.4 QFileSystemWatcher](#1.4 QFileSystemWatcher)
  • 2、Qt各种路径
    • [2.1 程序所在路径](#2.1 程序所在路径)
    • [2.2 程序的全路径](#2.2 程序的全路径)
    • [2.3 当前工作目录](#2.3 当前工作目录)
    • [2.4 用户目录路径](#2.4 用户目录路径)
    • [2.5 我的文档路径](#2.5 我的文档路径)
    • [2.6 桌面路径](#2.6 桌面路径)
    • [2.7 程序数据存放路径](#2.7 程序数据存放路径)
    • [2.8 临时文件路径](#2.8 临时文件路径)
    • [2.9 遍历文件](#2.9 遍历文件)
    • [2.10 路径封装类](#2.10 路径封装类)
    • [2.11 Qt读写文件(QFile)](#2.11 Qt读写文件(QFile))
    • [2.12 Qt读写文件(QTextStream)](#2.12 Qt读写文件(QTextStream))
    • [2.13 Qt读写文件(QDataStream)](#2.13 Qt读写文件(QDataStream))
    • [2.14 QSettings配置文件](#2.14 QSettings配置文件)
  • 3、C++各种路径
    • [3.1 获取当前工作目录](#3.1 获取当前工作目录)
    • [3.2 读取文件](#3.2 读取文件)
    • [3.3 写入文件](#3.3 写入文件)
  • 4、C#各种路径
    • [4.1 获取当前工作目录](#4.1 获取当前工作目录)
    • [4.2 读写文件](#4.2 读写文件)
  • 结语

1、简介

1.1 QDir

https://doc.qt.io/qt-5/qdir.html

QDir 用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。

cpp 复制代码
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 可以单独使用,也可以更方便地与 或 一起使用 。

cpp 复制代码
 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 的信息。

cpp 复制代码
#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
cpp 复制代码
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 类提供了一个接口,用于监视文件和目录以进行修改。

cpp 复制代码
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 程序所在路径

使用函数:

cpp 复制代码
QString QCoreApplication::applicationDirPath();

测试如下:

cpp 复制代码
#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 程序的全路径

使用函数:

cpp 复制代码
QString QCoreApplication::applicationFilePath();

测试如下:

cpp 复制代码
#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 当前工作目录

使用函数:

cpp 复制代码
QString QDir::currentPath()

测试如下:

cpp 复制代码
#include <QCoreApplication>
#include <QDebug>
#include <QDir>

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

    return a.exec();
}
  • 设置当前目录
cpp 复制代码
QDir::setCurrent("/home/user/myapp");

2.4 用户目录路径

Qt 5 中引入的方法:

cpp 复制代码
static QString QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
static QStringList QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
static QString QDir::homePath();

测试如下:

cpp 复制代码
#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 中引入的方法:

cpp 复制代码
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation);

测试如下:

cpp 复制代码
#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 中引入的方法:

cpp 复制代码
QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
QStandardPaths::standardLocations(QStandardPaths::DesktopLocation);

测试如下:

cpp 复制代码
#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 中引入的方法:

cpp 复制代码
QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
QStandardPaths::standardLocations(QStandardPaths::AppDataLocation);

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

测试如下:

cpp 复制代码
#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 中引入的方法:

cpp 复制代码
QStandardPaths::writableLocation(QStandardPaths::TempLocation);
QStandardPaths::standardLocations(QStandardPaths::TempLocation);
QDir::tempPath();

测试如下:

cpp 复制代码
#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设备。
cpp 复制代码
#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
cpp 复制代码
#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 遍历文件

cpp 复制代码
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 路径封装类

cpp 复制代码
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)

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

2.12 Qt读写文件(QTextStream)

使用QTextStream来读取文本文件

  • 读取文件
cpp 复制代码
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();
	}
}
  • 写文件
cpp 复制代码
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的二进制数据串行化。

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

2.14 QSettings配置文件

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

cpp 复制代码
#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 获取当前工作目录

cpp 复制代码
#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 读取文件

cpp 复制代码
#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 写入文件

cpp 复制代码
#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 获取当前工作目录

csharp 复制代码
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 读写文件

csharp 复制代码
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???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

相关推荐
huanggang9823 小时前
在Ubuntu22.04上使用Qt Creator开发ROS2项目
qt·ros2
老秦包你会4 小时前
Qt第三课 ----------容器类控件
开发语言·qt
spygg5 小时前
Qt低版本多网卡组播bug
qt·组播·多网卡组播·qt5.7.0
码农客栈5 小时前
qt QWebSocketServer详解
qt
plmm烟酒僧7 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
Black_Friend7 小时前
关于在VS中使用Qt不同版本报错的问题
开发语言·qt
CSUC7 小时前
【Qt】QTreeView 和 QStandardItemModel的关系
qt
冷凝女子8 小时前
【QT】海康视频及openCv抓拍正脸接口
qt·opencv·音视频·海康
苏三有春10 小时前
PyQt5实战——UTF-8编码器功能的实现(六)
开发语言·qt
Vanranrr10 小时前
C++ QT
java·c++·qt