Qt浅谈之十四:文件操作

一、简介

       通过QFile、QDir、QFileInfo和QFileSystemWatcher类简单介绍对文件和目录的一些操作。对文本流和数据流没有太多的介绍,还有一些Qt资源、统一资源定位符、缓冲区可以在以后应用中加上。

二、详解

1、QFile

可以读写文本文件、二进制文件和Qt资源文件,也可以和QTextStream和QDataStream一起使用。

(1)读写文本文件

[cpp]  view plain  copy
  1. QFile file(fileName);  
  2. if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {  
  3.     return -1;  
  4. }  
  5.   
  6. while (!file.atEnd()) {  
  7.     QByteArray line = file.readLine();  
  8.     for (int i = 0; i < line.size(); ++i)  
  9.         cout << line[i];    
  10. }  
  11. file.seek(0);      //回到文件开头  
  12. QTextStream in(&file);  
  13. while (!in.atEnd()) {  
  14.     QString line = in.readLine();  
  15.     cout << qPrintable(line) << endl;  
  16. }  

[cpp]  view plain  copy
  1. {  
  2.         QFile file("logfile.log");  
  3.         file.open(QIODevice::ReadWrite | QIODevice::Append | QIODevice::Text);  
  4.         QTextStream out(&file);  
  5.         out << QString("log11111") << endl;  
  6.         file.close();  
  7. }  

(2)读写二进制文件

[cpp]  view plain  copy
  1.         QFile file("binary.file");  
  2.     file.open(QIODevice::WriteOnly | QIODevice::Truncate);  
  3.     QDataStream out(&file);     
  4.     out << QString("caizhiming");     
  5.     out << QDate::fromString("1986/01/03""yyyy/MM/dd");  
  6.     out << (qint32)21;  
  7.     file.close();  
  8.   
  9.     file.setFileName("binary.file");  
  10.     if(!file.open(QIODevice::ReadOnly)) {  
  11.         return -1;  
  12.     }  
  13.     QDataStream in(&file);  
  14.     QString name;  
  15.     QDate birthday;  
  16.     qint32 age;  
  17.     in >> name >> birthday >> age;  
  18.     qDebug() << name << birthday << age;  
  19.     cout << qPrintable(name) << '\t' << qPrintable(birthday.toString("yyyy MMMM dd dddd")) << "\t" << age << endl;  
  20.     file.close();  

2、QDir

       QDir可以操作目录,存取目录或文件信息,操作底层文件系统,而且还可以存取Qt的资源文件。Qt使用/作为通用的目录分割符和URL路径分隔符,Qt会自动地转换你的路径来匹配你的基础的操作系统。Qt可以使用相对路径和绝对路径指向一个文件,isRelative()和 isAbsolute()函数可以判断QDir对象使用的是相对路径还是绝对路径。将相对路径转换为绝对路径使用makeAbsolute()函数。目录 路径可以通过path()函数返回,通过setPath()函数设置新路径,绝对路径使用absolutePath()返回。目录名可以使用 dirName()返回。目录的路径可以通过cd()、cdUp()改变,可以使mkdir()创建目录,rename()改变目录名。判断目录是否存在可以使用exists(),目录的属性可以使用 isReadable(),isAbsolute(),isRelative()和isRoot()来获取,目录下有很多条目,包括文件、目录和符号链 接,总的条目数可以使用count()来统计。entryList()可以返回目录下所有条目组成的字符串链表,文件可以使用remove()函数删 除,rmdir()删除目录。

(1) 绝对路径的用法:
QDir("/home/user/Documents")
QDir("C:/Documents and Settings")或使用QDir("C:\\Documents and Settings")来代替

相对路径的用法:
QDir("images/landscape.png") 

(2) QDir mDir("/home/user/Desktop");

mDir.exists(); //测试文件是否存在

mDir.absoluteFilePath("main.cpp"); //返回指定目录下指定文件的绝对路径

mDir.dirName(); //剥离掉路径,只返回目录的名字

其他的可以参看QT文档。

3、QFileInfo

       QFileInfo类提供了与系统无关的文件信息,它能提供文件名称和路径,存取权限,以及文件是否为目录或符号链接,文件大小,以 及最后修改/读取的时间等。QFileInfo也能从资源中获取信息。QFileInfo可以使用相对路径或绝对路径。

(1)文件属性信息

[cpp]  view plain  copy
  1.     QFileInfo info("/home/aoyang/network-manager-applet.tar.gz");  
  2.     bool isExists = info.exists();          //判断文件是否存在,若存在返回true  
  3.     qint64 size = info.size();              //获取文件大小,返回bytes  
  4.     QDateTime created = info.created();     //文件创建时间  
  5.     QDateTime lastModified = info.lastModified();  //文件最近修改时间  
  6.     QDateTime lastRead = info.lastRead();  //文件最近读取时间  
  7.     bool isDir = info.isDir();             //判断是否是路径  
  8.     bool isFile = info.isFile();           //判断是否是文件  
  9.     bool isSymLink = info.isSymLink();     //判断是否是符号链接  
  10.     bool isHidden = info.isHidden();       //文件是否隐藏  
  11.     bool isReadable = info.isReadable();   //文件是否可读  
  12.     bool isWritable = info.isWritable();   //文件是否可写  
  13.     bool isExecutable =info.isExecutable(); //文件是否可执行  

(2)文件路径信息

[cpp]  view plain  copy
  1.     QString absolutefilepath = info.absoluteFilePath(); //绝对文件路径:/home/aoyang/network-manager-applet.tar.gz  
  2.     QString absolutepath = info.absolutePath();         //绝对路径不包含文件名:/home/aoyang  
  3.     QString basename = info.baseName();                 //无路径并第一个.前的名称:network-manager-applet  
  4.     QString completebasename = info.completeBaseName(); //最后一个.前的名称:network-manager-applet.tar  
  5.     QString completesuffix = info.completeSuffix();     //第一个.后的后缀:tar.gz  
  6.     QString filename = info.fileName();                 //文件全名称:network-manager-applet.tar.gz  
  7.     QString filepath = info.filePath();                 //文件路径全名称:/home/aoyang/network-manager-applet.tar.gz  
  8.     QString path = info.path();                         //文件路径:/home/aoyang  
  9.     QString suffix = info.suffix();                     //文件后缀:gz  

4、QFileSystemWatcher文件系统监视器

[cpp]  view plain  copy
  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.   
  4. #include   
  5. #include   
  6.   
  7. namespace Ui {  
  8.     class MainWindow;  
  9. }  
  10.   
  11. class MainWindow : public QMainWindow  
  12. {  
  13.     Q_OBJECT  
  14.   
  15. public:  
  16.     explicit MainWindow(QWidget *parent = 0);  
  17.     ~MainWindow();  
  18.   
  19. private slots:  
  20.     void showMessage(const QString &path);  
  21.   
  22. private:  
  23.     Ui::MainWindow *ui;  
  24.     QFileSystemWatcher myWatcher;  
  25. };  
  26.   
  27. #endif // MAINWINDOW_H  
[cpp]  view plain  copy
  1. #include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3. #include   
  4. MainWindow::MainWindow(QWidget *parent) :  
  5.     QMainWindow(parent),  
  6.     ui(new Ui::MainWindow)  
  7. {  
  8.     ui->setupUi(this);  
  9.   
  10.     // 将监视器的信号和自定义的槽进行关联  
  11.     connect(&myWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(showMessage(QString)));  
  12.     connect(&myWatcher, SIGNAL(fileChanged(QString)), this, SLOT(showMessage(QString)));  
  13.   
  14.     // 显示出当前目录下的所有.h文件  
  15.     QDir myDir(QDir::currentPath());  
  16.     myDir.setNameFilters(QStringList("*.h"));  
  17.     ui->listWidget->addItem(myDir.absolutePath() + tr("目录下的.h文件有:"));  
  18.     ui->listWidget->addItems(myDir.entryList());  
  19.   
  20.     // 创建目录,并将其加入到监视器中  
  21.     myDir.mkdir("mydir");  
  22.     myDir.cd("mydir");  
  23.     ui->listWidget->addItem(tr("监视的目录:") + myDir.absolutePath());  
  24.     myWatcher.addPath(myDir.absolutePath());  
  25.     // 创建文件,并将其加入到监视器中  
  26.     QFile file(myDir.absolutePath() + "/myfile.txt");  
  27.     if (file.open(QIODevice::WriteOnly)) {  
  28.         QFileInfo info(file);  
  29.         ui->listWidget->addItem(tr("监视的文件:") + info.absoluteFilePath());  
  30.         myWatcher.addPath(info.absoluteFilePath());  
  31.         file.close();  
  32.     }  
  33. }  
  34.   
  35. MainWindow::~MainWindow()  
  36. {  
  37.     delete ui;  
  38. }  
  39.   
  40. // 显示文件或目录改变信息  
  41. void MainWindow::showMessage(const QString &path)  
  42. {  
  43.     QDir dir(QDir::currentPath() + "/mydir");  
  44.     // 如果是目录发生了改变  
  45.     if (path == dir.absolutePath()) {  
  46.         ui->listWidget->addItem(dir.dirName() + tr("目录发生改变: "));  
  47.         ui->listWidget->addItems(dir.entryList());  
  48.     } else { // 如果是文件发生了改变  
  49.         ui->listWidget->addItem(path + tr("文件发生改变!"));  
  50.     }  
  51. }  
[cpp]  view plain  copy
  1. /******************************************************************************** 
  2. ** Form generated from reading UI file 'mainwindow.ui' 
  3. ** 
  4. ** Created: Wed Jul 30 17:53:29 2014 
  5. **      by: Qt User Interface Compiler version 4.6.2 
  6. ** 
  7. ** WARNING! All changes made in this file will be lost when recompiling UI file! 
  8. ********************************************************************************/  
  9.   
  10. #ifndef UI_MAINWINDOW_H  
  11. #define UI_MAINWINDOW_H  
  12.   
  13. #include   
  14. #include   
  15. #include   
  16. #include   
  17. #include   
  18. #include   
  19. #include   
  20. #include   
  21. #include   
  22. #include   
  23. #include   
  24. #include   
  25.   
  26. QT_BEGIN_NAMESPACE  
  27.   
  28. class Ui_MainWindow  
  29. {  
  30. public:  
  31.     QWidget *centralWidget;  
  32.     QVBoxLayout *verticalLayout;  
  33.     QListWidget *listWidget;  
  34.     QMenuBar *menuBar;  
  35.     QToolBar *mainToolBar;  
  36.     QStatusBar *statusBar;  
  37.   
  38.     void setupUi(QMainWindow *MainWindow)  
  39.     {  
  40.         if (MainWindow->objectName().isEmpty())  
  41.             MainWindow->setObjectName(QString::fromUtf8("MainWindow"));  
  42.         MainWindow->resize(400, 300);  
  43.         centralWidget = new QWidget(MainWindow);  
  44.         centralWidget->setObjectName(QString::fromUtf8("centralWidget"));  
  45.         verticalLayout = new QVBoxLayout(centralWidget);  
  46.         verticalLayout->setSpacing(6);  
  47.         verticalLayout->setContentsMargins(11, 11, 11, 11);  
  48.         verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));  
  49.         listWidget = new QListWidget(centralWidget);  
  50.         listWidget->setObjectName(QString::fromUtf8("listWidget"));  
  51.   
  52.         verticalLayout->addWidget(listWidget);  
  53.   
  54.         MainWindow->setCentralWidget(centralWidget);  
  55.         menuBar = new QMenuBar(MainWindow);  
  56.         menuBar->setObjectName(QString::fromUtf8("menuBar"));  
  57.         menuBar->setGeometry(QRect(0, 0, 400, 25));  
  58.         MainWindow->setMenuBar(menuBar);  
  59.         mainToolBar = new QToolBar(MainWindow);  
  60.         mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));  
  61.         MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);  
  62.         statusBar = new QStatusBar(MainWindow);  
  63.         statusBar->setObjectName(QString::fromUtf8("statusBar"));  
  64.         MainWindow->setStatusBar(statusBar);  
  65.   
  66.         retranslateUi(MainWindow);  
  67.   
  68.         QMetaObject::connectSlotsByName(MainWindow);  
  69.     } // setupUi  
  70.   
  71.     void retranslateUi(QMainWindow *MainWindow)  
  72.     {  
  73.         MainWindow->setWindowTitle(QApplication::translate("MainWindow""MainWindow", 0, QApplication::UnicodeUTF8));  
  74.     } // retranslateUi  
  75.   
  76. };  
  77.   
  78. namespace Ui {  
  79.     class MainWindow: public Ui_MainWindow {};  
  80. // namespace Ui  
  81.   
  82. QT_END_NAMESPACE  
  83.   
  84. #endif // UI_MAINWINDOW_H  


       目录的改变和文件的改变都能监视到,文件改变会收到一次信号,但是文件改变目录发出了很多次变化,其中除了临时文件的创建和删除,还有两次不知道为什么会收到信号,这个等有机会在了解。

四、总结

(1)只是总结了常用的部分,其他的使用时可以直接参看Qt的参考文档,Qt4.3又加入了许多比较新的特性。

(2)本人思路有限,若有更好的建议,也可发邮件沟通,在此先感谢!邮箱地址[email protected]

你可能感兴趣的:(MatLab)