1. 程式人生 > >Qt5 實現檔案複製並在指定路徑下建立資料夾

Qt5 實現檔案複製並在指定路徑下建立資料夾

最近在基於qt5平臺的應用介面上想實現本地選擇檔案,並把檔案拷貝到指定路徑下。找到以下這篇文章參考,參考其中幾個函式的寫法實現了想要的功能,故記錄一下,方便以後查詢參考。

我在標頭檔案中定義幾個變數:   

    QFileDialog    *mFileDlg;
    QString mFileName;
    QLineEdit *mFilePath;

在.cpp實現檔案中程式碼如下:

    mFilePath = new QLineEdit(this);
    mFileName = QFileDialog::getOpenFileName(this,tr("Open File"));
    mFilePath->setText(mFileName);
    HelperPrintf("current file name is: %s",mFileName);

    QFile file(mFileName);
    QFileInfo info(mFileName);
    QString dstPath = QString(DST_FILE_PATH) + QString("/");
    QDir directory ;
    directory.cd(dstPath);
    dstPath += info.fileName();
    file.copy(dstPath);
    file.close();

    QFile checkPath(dstPath);
    if(checkPath.open(QFile::ReadOnly))
    {
        QMessageBox msgBox;
        msgBox.setText("File copy success!");
        msgBox.setStandardButtons(QMessageBox::Ok);
        msgBox.exec();
    }
    checkPath.close();

部落格原文如下:

最近想做一個區域網的圖書管理的一個應用,希望能夠管理本地的電子書資源,同時分享給在同一個區域網的使用者們。因此在本地需要建立一個圖書的管理目錄出來(暫時是這樣想的),因此需要對電腦上的資源進行統一的移動和複製,同時將可能以後需要的資訊進行儲存下來,在Qt中可能設計到相關內容的包含:

  • QFile 的使用
  • QDir 的使用
  • QFileInfo的使用
  • QFileDialog的使用
QFile類提供了讀取檔案和操作檔案的介面,可以讀寫文字檔案以及二進位制檔案,以及資原始檔。通常常用的函式包含open()close()函式的使用。

QDir類

使得可以訪問目錄結構以及目錄下的檔案資訊。可以操作路徑名、訪問路徑以及檔案的相關資訊。可以通過mkdir()建立目錄以及重新命名目錄。

QFileInfo類可以提供與作業系統無關的檔案資訊,包含檔案的名稱和檔案系統的位置,檔案的訪問許可權以及是否是一個目錄。可以通過函式path()fileName()獲取檔案的路徑和檔名,同時baseName()可以獲得檔案的基本名稱,即不包含字尾名。

下面一個簡單的例項,可以通過選擇需要複製的檔案,複製到相應的目錄下。同時根據檔名,在相應的目錄下建立對應檔案的子目錄。實現的是,在一個介面進行檔案的操作,包括錄入圖書的資訊,包括書名,作者以及出版商,以及書的封面,然後儲存。

標頭檔案內容為:

  1. #ifndef UPLOADFRAME_H
  2. #define UPLOADFRAME_H
  3. #include <QWidget>
  4. #include<QFrame>
  5. class QLabel;  
  6. class QIcon;  
  7. class QPushButton;  
  8. class QLineEdit;  
  9. class QTextBrower;  
  10. class QToolButton;  
  11. class UpLoadFrame : public QWidget  
  12. {  
  13.     Q_OBJECT  
  14. public:  
  15.     explicit UpLoadFrame(QWidget *parent = 0);  
  16.     void init();  
  17.     QString getWritername();  
  18.     QString getBookname();  
  19.     QString getPublisername();  
  20.     QString getAboutBook();  
  21.     QPixmap getBookfage();  
  22. signals:  
  23. protected slots:  
  24.     void doChoosepathbutton();  
  25.     void doSaveButton();  
  26.     void doBookFaceClicked();  
  27. private:  
  28.     QLineEdit *filepath;  
  29.     QPushButton *choosepath;  
  30.     QToolButton *bookface;  
  31.     QLineEdit *writername;  
  32.     QLineEdit *publisher;  
  33.     QLineEdit *bookname;  
  34.     QLineEdit *aboutbook;  
  35.     QPushButton *saveButton;  
  36.     QString fileName;  
  37.     QString picpath;  
  38. };  
  39. #endif // UPLOADFRAME_H
重點是實現三個槽。首先是第一個槽,doChoosepathbutton(),通過店家choosepath按鍵,開啟一個選擇檔案的對話方塊選擇檔案,在該函式中實現檔案路徑的讀取,通過檔案的讀取,自動設定書名。實現內容如下:
  1. void UpLoadFrame::doChoosepathbutton()  
  2. {  
  3.     fileName =QFileDialog::getOpenFileName(this,tr("開啟檔案"));  
  4.     filepath->setText(fileName);  
  5.     QFileInfo info(fileName);  
  6.     bookname->setText(info.baseName());  
  7. }  
其中一個關鍵的只是點是關於QFileDialog的知識點:

QFileDialog可以建立一個對話方塊,允許用於選擇檔案和目錄。getOpenFileName()函式可以選擇一個已經存在於目錄下的檔案,如果取消了檔案的選擇,就會返回已給空的指標。第一個引數代表父空間的指標地址,第二個是代表對話方塊的名稱。

其次是實現doSaveButton(),當得到需要複製的檔案後,就需要比較負責的檔案操作了,比如檔案的複製,目錄的建立以及文字檔案的資訊的寫入。以下是實現的內容:

  1. void UpLoadFrame::doSaveButton()  
  2. {  
  3.     QFile file(fileName);  
  4.     QFileInfo info(fileName);  
  5.     QString newpath=QString("G:/Reader_Resource")+QString("/");  
  6.    //------------------------建立對應書籍的目錄------------------------//
  7.     QDir dir;  
  8.     dir.cd(newpath);  
  9.     dir.mkdir(info.baseName());  
  10.     newpath+=info.baseName();  
  11.     //----------------讀取圖書的資訊並儲存在對應的目錄下-----------------//
  12.     QFile bookinfo(newpath+"/"+info.baseName()+".txt");  
  13.     QFileInfo tmp(bookinfo);  
  14.     aboutbook->setText(tmp.absoluteFilePath());  
  15.     if( bookinfo.open(QFile::ReadWrite))  
  16.     {  
  17.         QTextStream out(&bookinfo);  
  18.         out<<writername->text()<<"\r\n"<<endl;  
  19.         out<<bookname->text()<<"\r\n"<<endl;  
  20.         out<<publisher->text()<<"\r\n"<<endl;  
  21.     }  
  22.     bookinfo.setFileName(info.baseName()+".txt");  
  23.     bookinfo.close();  
  24.     //--------------------------------------------------------------//
  25.     newpath+=QString("/");  
  26.     //----