QT中获取文件路径、文件名、后缀 (***)

QFileInfo是一个用于获取文件信息的工具类,可以获取文件路径、大小、类型、后缀等属性。file_suffix仅返回最后一个后缀,而complete_suffix能获取所有连续的后缀。文件的属性还包括创建、修改和访问时间,以及权限和所有权。在Unix系统中,QFileInfo直接处理符号链接,而在Windows上,.lnk文件被视为符号链接。QFileInfo的性能优化包括缓存信息和使用refresh()刷新数据。

目录

可获得文件的全名,包含全部的后缀。

QFileInfo理论总结 (**)

====================

已验证的样例

void MainWindow::on_pushButton_clicked()
{
    QString file_full, file_name, current_Path, file_path, file_suffix, complete_suffix, file_baseName, file_completeBaseName ;
    QFileInfo fileinfo; // <<------
    file_full =QFileDialog::getOpenFileName(this, "Open File", "QCoreApplication::applicationFilePath()",
                                            "AllFile (*.*);;");
    //-----------------------------
    fileinfo =QFileInfo(file_full);//file_full:包含路径的文件全名

    current_Path =fileInfo.path(); // returns "/home/dipper"  :: QFileInfo fileInfo("/home/dipper/xyz.tar.gz");

    file_path = fileinfo.absolutePath(); //绝对路径

    file_name = fileinfo.fileName(); //文件全名,包含全部后缀

    file_suffix = fileinfo.suffix(); //只含最后一个后缀
    complete_suffix = fileinfo.completeSuffix(); //连续多个的全部后缀

    file_baseName = fileinfo.baseName();
    file_completeBaseName = fileinfo.completeBaseName();

    //-----------------------------
    qDebug()<<"current_Path : "<<current_Path;

    qDebug()<<"file_path : "<<file_path;

    qDebug()<<"file_name : "<<file_name;

    qDebug()<<"file_suffix : "<<file_suffix;
    qDebug()<<"complete_suffix : "<<complete_suffix;

    qDebug()<<"file_baseName : "<<file_baseName;
    qDebug()<<"file_completeBaseName : "<<file_completeBaseName;
}

输出:

file_path : "C:/Users/abcdef/Documents/zzzxxx"

file_name : "zz.abc.cde.fgh"

file_suffix : " fgh"  // fileinfo.suffix() : 只能获得最后一个后缀
complete_suffix : " abc.cde.fgh" // fileinfo.completeSuffix() : 可获得全部的后缀。

file_baseName : "zz"
file_completeBaseName : "zz.abc.cde"

完整的文件名的够成:
file_completeBaseName+ file_suffix

file_baseName + complete_suffix

可获得文件的全名,包含全部的后缀。

如:qDebug()的输出结果:

file_name : "zz.abc.cde.fgh"

参考: https://blog.csdn.net/zq9955/article/details/122401773

======================

QCoreApplication::application DirPath(); //获取项目的根路径
QCoreApplication::application FilePath();  //获取文件的根路径

    qDebug()<<"QCoreApplication::applicationDirPath() : "<<QCoreApplication::applicationDirPath();
    qDebug()<<"QCoreApplication::applicationFilePath(); : "<<QCoreApplication::applicationFilePath(); 

输出结果:

QCoreApplication::applicationDirPath() : "C:/Users/abcdef/Documents/build-untitled6-Desktop_Qt_5_14_2_MinGW_64_bit-Debug/debug"  // 注意: win和 linux的Qt默认显示有差异;但并不影响真实路径构造的结果?

QCoreApplication::applicationFilePath(); : "C:/Users/abcdef/Documents/build-untitled6-Desktop_Qt_5_14_2_MinGW_64_bit-Debug/debug/untitled6.exe"

======================

QString file_full, file_name, file_path,file_suffix ;
QFileInfo fileinfo;
file_full = QFileDialog::getOpenFileName(this,.....);
fileinfo =QFileInfo(file_full);//文件名
file_name = fileinfo.fileName();//文件后缀
file_suffix = fileinfo.suffix()//绝对路径
file_path = fileinfo.absolutePath();

https://www.jianshu.com/p/f7b2ae13bcca

QString runPath = QCoreApplication::applicationDirPath();//获取项目的根路径
QString file_name = QFileDialog::getOpenFileName(this,QStringLiteral("选择文件"),runPath,"Text Files(*.txt)",nullptr,QFileDialog::DontResolveSymlinks);

    static QString getOpenFileName(QWidget *parent = nullptr,
                                   const QString &caption = QString(),
                                   const QString &dir = QString(),
                                   const QString &filter = QString(),
                                   QString *selectedFilter = nullptr,
                                   Options options = Options());

第一个参数parent,用于指定父组件,可以看到QT默认这个参数是可以为空的,如果不想提供父控件,你可以直接写nullptr,但是我建议你写一个父控件,例如this即可。这样选择文件的弹框就可以在父控件中间显示。就像这样,弹框的中心和父控件中心是相同的

第二个参数caption,是对话框的标题,例如上图中的“选择文件”就是这么来的

第三个参数dir,是对话框显示时默认打开的目录,"“不写任何参数,那么会默认打开工程的目录,我一般会写”"或者提供项目的根目录;  “.”:打开当前目录?

第四个参数filter,是对话框的后缀名过滤器,如果不写,那么任何文件都会显示,如果写了会根据过滤器显示;

如果选择的文件是同一个类型,只是后缀不同,用空格隔开就好,例如都是图片,“Files(.jpg .png)”,代表只能选择后缀为jpg或者png的图片

如果选择的文件是不同类型,那么需要多个过滤器,过滤器之间用两个分号分隔,例如 "Image Files(.jpg);;Text Files(.png)";

第五个参数selectedFilter,是默认选择的过滤器,写nullptr就行,因为QT默认也是空,啥也没过滤;

第六个参数options,是对话框的一些参数设定,比如只显示文件夹等等,它的取值是enum QFileDialog::Option,每个选项可以使用 | 运算组合起来。

关于option参数,QT提供了很多种:

https://www.freesion.com/article/64581504018/

本博参考:https://blog.csdn.net/ken2232/article/details/129745712

QFileInfo理论总结 (**)

1. 简述

2. 常用文件属性

3. 符号链接相关(其实就是快捷方式的问题)

4. 性能

1. 简述

QFileInfo其实就是获取文件信息的一个工具类,传入一个路径就能获取文件信息。

QFileInfo提供了文件在文件系统中的名称和位置(路径) 、它的访问权限以及它是目录还是符号链接等信息。

文件的大小和最后修改/读取时间也是可用的。

QFileInfo还可以用于获取关于Qt resource的信息。

QFileInfo获取具有相对绝对文件路径的文件信息。绝对文件路径以目录分隔符“/”开头(或者在Windows上以驱动器规格开头) 。相对文件名以目录名或文件名开头,并指定相对于当前工作目录的路径。

绝对路径的一个例子是字符串"/tmp/quartz"。相对路径可能类似于“src/fatlib”。或者是“./src/fatlib”之类的。

QFileInfo要处理的文件是在构造函数中设置文件路径,或者稍后使用setFile() 设置的。

2. 常用文件属性

常用的文件属性如下:

  1. 我们可以使用 isRelative() 函数来检查是否使用相对或绝对文件路径,可以调用 makeAbsolute() 函数将相对路径转换为绝对路径。

  1. 使用exists() 查看文件是否存在,使用size() 获取文件大小。

  1. 文件类型通过isFile() , isDir() 和isSymLink() 获得。

  

  1. symLinkTarget() 函数提供符号链接所指向的文件名。

  1. 文件名的元素可以用 path() 和 fileName() 获取。

  1. fileName() 的部分可以用baseName() , suffix() 或completeSuffix() 提取,其实就是获取后缀文件名之类的,看下面代码就知道啦。

QFileInfo fi("/tmp/archive.tar.gz");
QString name = fi.fileName(); // name = "archive.tar.gz"

QFileInfo fi("/tmp/archive.tar.gz");
QString base = fi.baseName(); // base = "archive"

QFileInfo fi("/Applications/Safari.app");
QString bundle = fi.bundleName(); // name = "Safari"

QFileInfo fi("/tmp/archive.tar.gz");
QString base = fi.completeBaseName(); // base = "archive.tar"

QFileInfo fi("/tmp/archive.tar.gz");
QString ext = fi.suffix(); // ext = "gz"

QFileInfo fi("/tmp/archive.tar.gz");
QString ext = fi.completeSuffix(); // ext = "tar.gz"

  1. 文件的日期由created() , lastModified() , lastRead() 和fileTime() 返回。

  1. 有关文件访问权限的信息是通过isReadable() , isWritable() 和isExecutable() 获得的。

  1. 该文件的所有权可从owner() 、ownerId() 、group() 和groupId() 获得。

  

  1. 可以使用permission() 函数在一条语句中检查文件的权限和所有权。

注意:在NTFS文件系统上,出于性能原因,所有权和权限检查默认情况下是禁用的。代码都是c++哈直接加在main函数里就行,要启用它,包括以下行:

extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;

然后,通过qt_ntfs_permission_lookup加1和减1来打开和关闭权限检查。

qt_ntfs_permission_lookup + +;//打开检查
qt_ntfs_permission_lookup——;//再次关闭

3. 符号链接相关(其实就是快捷方式的问题)

这个我们看那个代码就好,因为每个系统的文件信息结构有些不一样。

在Unix(包括macOS和iOS,当然必须包括Linux哈,这个Linux就是类Unix系统) 上,该类中获取文件属性的函数是直接返回目标文件的时间和大小等属性,而不是符号链接,因为Unix透明地处理符号链接。

使用QFile打开符号链接可以有效地打开链接的目标。例如:

#ifdef Q_OS_UNIX

QFileInfo info1("/home/bob/bin/untabify") ;
info1.isSymLink() ; // returns true
info1.absoluteFilePath() ; // returns "/home/bob/bin/untabify"
info1.size() ; // returns 56201
info1.symLinkTarget() ; // returns "/opt/pretty++/bin/untabify"

QFileInfo info2(info1.symLinkTarget() ) ;
info2.isSymLink() ; // returns false
info2.absoluteFilePath() ; // returns "/opt/pretty++/bin/untabify"
info2.size() ; // returns 56201
#endif

在Windows上,快捷方式(.lnk文件) 目前被视为符号链接。在Unix系统中,获取这个链接属性返回目标文件的大小,而不是.lnk文件本身。这种行为已被弃用,并可能在Qt的未来版本中被删除,之后.lnk文件将被视为常规文件。

#ifdef Q_OS_WIN

QFileInfo info1("C:\\Documents and Settings\\Bob\\untabify.lnk") ;
info1.isSymLink() ; // returns true
info1.absoluteFilePath() ; // returns "C:/Documents and Settings/Bob/untabify.lnk"
info1.size() ; // returns 743
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

4. 性能

QFileInfo的一些函数查询文件系统,但出于性能考虑,一些函数只对文件名本身进行操作,就不用每次都去操作系统查询。

例如:要返回相对文件名的绝对路径,absolutePath() 必须查询文件系统。然而,path() 函数可以直接处理文件名,因此速度更快。

注意:为了提高性能,QFileInfo缓存文件的信息。

由于文件可以由其他用户或程序更改,甚至可以由同一程序的其他部分更改,因此有一个刷新文件信息的函数: refresh() ,我们在查询之前就可以先刷新一下这个,然后获取就好。如果你想关闭一个QFileInfo的缓存,并强制它在每次请求信息时访问文件系统,请调用 setCaching(false)

————————————————

版权声明:本文为CSDN博主「太阳风暴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_43680827/article/details/128452961

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值