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

相关推荐
用户805533698039 小时前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner10 小时前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz5 天前
QML Hello World 入门示例
qt
xcyxiner8 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner9 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner9 天前
DicomViewer (添加模型类)3
qt
xcyxiner10 天前
DicomViewer (目录调整) 2
qt
xcyxiner10 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能12 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G12 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt