<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 在 Qt4 中使用文件和目錄 > 原文: [http://zetcode.com/gui/qt4/files/](http://zetcode.com/gui/qt4/files/) 在 Qt4 C++ 編程教程的這一部分中,我們處理文件和目錄。 `QFile`,`QDir`和`QFileInfo`是在 Qt4 中處理文件的基本類。 `QFile`提供了用于讀取和寫入文件的接口。 `QDir`提供對目錄結構及其內容的訪問。 `QFileInfo`提供與系統無關的文件信息,包括文件名和在文件系統中的位置,訪問時間和修改時間,權限或文件所有權。 ## 文件大小 在下一個示例中,我們確定文件的大小。 `file_size.cpp` ```cpp #include <QTextStream> #include <QFileInfo> int main(int argc, char *argv[]) { QTextStream out(stdout); if (argc != 2) { qWarning("Usage: file_size file"); return 1; } QString filename = argv[1]; if (!QFile(filename).exists()) { qWarning("The file does not exist"); return 1; } QFileInfo fileinfo(filename); qint64 size = fileinfo.size(); QString str = "The size is: %1 bytes"; out << str.arg(size) << endl; } ``` 文件的大小由`QFileInfo`的`size()`方法確定。 ```cpp QString filename = argv[1]; ``` 文件名作為參數傳遞給程序。 ```cpp if (!QFile(filename).exists()) { qWarning("The file does not exist"); return 1; } ``` 使用`QFile`類的`exists()`方法檢查文件的存在。 如果不存在,我們將發出警告并終止程序。 ```cpp QFileInfo fileinfo(filename); ``` 創建`QFileInfo`的實例。 ```cpp qint64 size = fileinfo.size(); ``` 文件大小由`size()`方法確定。 `qint64`是在 Qt 支持的所有平臺上保證為 64 位的類型。 ```cpp QString str = "The size is: %1 bytes"; out << str.arg(size) << endl; ``` 結果將打印到控制臺。 ```cpp $ ./file_size Makefile The size is: 7483 bytes ``` 這是示例的輸出。 ## 讀取文件內容 為了讀取文件的內容,我們必須首先打開文件進行讀取。 然后創建一個輸入文件流; 從該流中讀取數據。 `read_file.cpp` ```cpp #include <QTextStream> #include <QFile> int main(void) { QTextStream out(stdout); QFile file("colours"); if (!file.open(QIODevice::ReadOnly)) { qWarning("Cannot open file for reading"); return 1; } QTextStream in(&file); while (!in.atEnd()) { QString line = in.readLine(); out << line << endl; } file.close(); } ``` 該示例從`colours`文件讀取數據。 該文件包含八種顏色的名稱。 ```cpp QFile file("colours"); ``` 創建`QFile`對象的實例。 ```cpp if (!file.open(QIODevice::ReadOnly)) { qWarning("Cannot open file for reading"); return 1; } ``` `QFile`的`open()`方法以只讀模式打開文件。 如果該方法失敗,我們將發出警告并終止程序。 ```cpp QTextStream in(&file); ``` 創建輸入流。 `QTextStream`接收文件句柄。 將從該流中讀取數據。 ```cpp while (!in.atEnd()) { QString line = in.readLine(); out << line << endl; } ``` 在`while`循環中,我們逐行讀取文件,直到文件結束。 如果沒有更多數據要從流中讀取,則`atEnd()`方法返回`true`。 `readLine()`方法從流中讀取一行。 ```cpp file.close(); ``` `close()`方法刷新數據并關閉文件句柄。 ```cpp $ ./read_file colours red green blue yellow brown white black orange ``` 這是示例的輸出。 ## 寫入文件 為了寫入文件,我們在寫入模式下打開文件,創建定向到該文件的輸出流,并使用寫入運算符寫入該流。 `write2file.cpp` ```cpp #include <QTextStream> #include <QFile> int main(void) { QTextStream out(stdout); QString filename = "distros"; QFile file(filename); if (file.open(QIODevice::WriteOnly)) { QTextStream out(&file); out << "Xubuntu" << endl; out << "Arch" << endl; out << "Debian" << endl; out << "Redhat" << endl; out << "Slackware" << endl; } else { qWarning("Could not open file"); } file.close(); } ``` 該示例將五個 Linux 發行版的名稱寫入名為`distros`的文件名。 ```cpp QString filename = "distros"; QFile file(filename); ``` 使用提供的文件名創建`QFile`對象。 ```cpp if (file.open(QIODevice::WriteOnly)) { ``` 使用`open()`方法,我們以只寫方法打開文件。 ```cpp QTextStream out(&file); ``` 該行創建一個在文件句柄上運行的`QTextStream`。 換句話說,要寫入的數據流被定向到文件。 ```cpp out << "Xubuntu" << endl; out << "Arch" << endl; out << "Debian" << endl; out << "Redhat" << endl; out << "Slackware" << endl; ``` 數據通過`<<`運算符寫入。 ```cpp file.close(); ``` 最后,文件句柄被關閉。 ```cpp $ ./write2file $ cat distros Xubuntu Arch Debian Redhat Slackware ``` 這是示例輸出。 ## 復制文件 復制文件時,我們將使用文件名或文件系統的不同位置來精確復制該文件。 `copy_file.cpp` ```cpp #include <QTextStream> #include <QFile> int main(int argc, char *argv[]) { QTextStream out(stdout); if (argc != 3) { qWarning("Usage: copyfile source destination"); return 1; } QString source = argv[1]; if (!QFile(source).exists()) { qWarning("The source file does not exist"); return 1; } QString destin(argv[2]); QFile::copy(source, destin); } ``` 該示例使用`QFile::copy()`方法創建提供的文件的副本。 ```cpp if (argc != 3) { qWarning("Usage: copyfile source destination"); return 1; } ``` 該程序有兩個參數。 如果未給出,則以警告消息結尾。 ```cpp QString source = argv[1]; ``` 從程序的命令行參數中,我們獲得源文件的名稱。 ```cpp if (!QFile(source).exists()) { qWarning("The source file does not exist"); return 1; } ``` 我們使用`QFile`的`exists()`方法檢查源文件是否存在。 如果它不存在,我們將以警告消息終止該程序。 ```cpp QString destin(argv[2]); ``` 我們得到目標文件名。 ```cpp QFile::copy(source, destin); ``` 使用`QFile::copy()`方法復制源文件。 第一個參數是源文件名,第二個參數是目標文件名。 ## 文件所有者和組 每個文件都有一個擁有者的用戶。 文件也屬于一組用戶,以更好地管理和保護文件。 `owner.cpp` ```cpp #include <QTextStream> #include <QFileInfo> int main(int argc, char *argv[]) { QTextStream out(stdout); if (argc != 2) { qWarning("Usage: owner file"); return 1; } QString filename = argv[1]; QFileInfo fileinfo(filename); QString group = fileinfo.group(); QString owner = fileinfo.owner(); out << "Group: " << group << endl; out << "Owner: " << owner << endl; } ``` 該示例打印給定文件的所有者和主要組。 ```cpp QFileInfo fileinfo(filename); ``` 創建`QFileInfo`類的實例。 它的參數是作為命令行參數給出的文件名。 ```cpp QString group = fileinfo.group(); ``` 文件的主要組是通過`QFileInfo`的`group()`方法確定的。 ```cpp QString owner = fileinfo.owner(); ``` 文件的所有者通過`QFileInfo`的`owner()`方法確定。 ```cpp $ touch myfile $ ./owner myfile Group: janbodnar Owner: janbodnar ``` 系統會自動為新創建的文件提供用戶的默認組。 ## 上次讀取,上次修改 文件存儲有關上次讀取或修改它們的信息。 要獲取此信息,我們使用`QFileInfo`類。 `file_times.cpp` ```cpp #include <QTextStream> #include <QFileInfo> #include <QDateTime> int main(int argc, char *argv[]) { QTextStream out(stdout); if (argc != 2) { qWarning("Usage: file_times file"); return 1; } QString filename = argv[1]; QFileInfo fileinfo(filename); QDateTime last_rea = fileinfo.lastRead(); QDateTime last_mod = fileinfo.lastModified(); out << "Last read: " << last_rea.toString() << endl; out << "Last modified: " << last_mod.toString() << endl; } ``` 該示例打印給定文件的最后讀取時間和最后修改時間。 ```cpp QFileInfo fileinfo(filename); ``` `QFileInfo`對象已創建。 ```cpp QDateTime last_rea = fileinfo.lastRead(); ``` `lastRead()`方法返回上次讀取(訪問)文件的日期和時間。 ```cpp QDateTime last_mod = fileinfo.lastModified(); ``` `lastModified()`方法返回上次修改文件的日期和時間。 ```cpp $ ./file_times Makefile Last read: Mon Oct 19 10:23:54 2015 Last modified: Mon Oct 19 10:23:33 2015 ``` 時間可以相同也可以不相同。 ## 處理目錄 `QDir`類具有用于處理目錄的方法。 `dirs.cpp` ```cpp #include <QTextStream> #include <QDir> int main(void) { QTextStream out(stdout); QDir dir; if (dir.mkdir("mydir")) { out << "mydir successfully created" << endl; } dir.mkdir("mydir2"); if (dir.exists("mydir2")) { dir.rename("mydir2", "newdir"); } dir.mkpath("temp/newdir"); } ``` 在示例中,我們提供了四種使用目錄的方法。 ```cpp if (dir.mkdir("mydir")) { out << "mydir successfully created" << endl; } ``` `mkdir()`方法創建一個目錄。 如果目錄創建成功,則返回`true`。 ```cpp if (dir.exists("mydir2")) { dir.rename("mydir2", "newdir"); } ``` `exists()`檢查目錄是否存在。 `rename()`方法重命名目錄。 ```cpp dir.mkpath("temp/newdir"); ``` `mkpath()`一鍵創建一個新目錄和所有必要的父目錄。 ## 特殊路徑 文件系統中有一些特殊的路徑。 例如主目錄或根目錄。 `QDir`類用于獲取系統中的特殊路徑。 `special_paths.cpp` ```cpp #include <QTextStream> #include <QDir> int main(void) { QTextStream out(stdout); out << "Current path:" << QDir::currentPath() << endl; out << "Home path:" << QDir::homePath() << endl; out << "Temporary path:" << QDir::tempPath() << endl; out << "Rooth path:" << QDir::rootPath() << endl; } ``` 該示例打印四個特殊路徑。 ```cpp out << "Current path:" << QDir::currentPath() << endl; ``` 當前的工作目錄使用`QDir::currentPath()`方法檢索。 ```cpp out << "Home path:" << QDir::homePath() << endl; ``` 使用`QDir::homePath()`方法返回主目錄。 ```cpp out << "Temporary path:" << QDir::tempPath() << endl; ``` 使用`QDir::tempPath()`方法檢索臨時目錄。 ```cpp out << "Rooth path:" << QDir::rootPath() << endl; ``` 根目錄通過`QDir::rootPath()`方法返回。 ```cpp $ ./special_paths Current path:/home/janbodnar/prog/qt4/files/special_paths Home path:/home/janbodnar Temporary path:/tmp Rooth path:/ ``` 這是一個示例輸出。 ## 文件路徑 文件由文件名和路徑標識。 路徑由文件名,基本名和后綴組成。 `file_path.cpp` ```cpp #include <QTextStream> #include <QFileInfo> int main(int argc, char *argv[]) { QTextStream out(stdout); if (argc != 2) { out << "Usage: file_times file" << endl; return 1; } QString filename = argv[1]; QFileInfo fileinfo(filename); QString absPath = fileinfo.absoluteFilePath(); QString baseName = fileinfo.baseName(); QString compBaseName = fileinfo.completeBaseName(); QString fileName = fileinfo.fileName(); QString suffix = fileinfo.suffix(); QString compSuffix = fileinfo.completeSuffix(); out << "Absolute file path: " << absPath << endl; out << "Base name: " << baseName << endl; out << "Complete base name: " << compBaseName << endl; out << "File name: " << fileName << endl; out << "Suffix: " << suffix << endl; out << "Whole suffix: " << compSuffix << endl; } ``` 在示例中,我們使用幾種方法來打印文件路徑及其給定文件名的一部分。 ```cpp QFileInfo fileinfo(filename); ``` 文件路徑是使用`QFileInfo`類標識的。 ```cpp QString absPath = fileinfo.absoluteFilePath(); ``` `absoluteFilePath()`方法返回包含文件名的絕對路徑。 ```cpp QString baseName = fileinfo.baseName(); ``` `baseName()`方法返回基本名稱-沒有路徑的文件名稱。 ```cpp QString compBaseName = fileinfo.completeBaseName(); ``` `completeBaseName()`方法返回完整的基本名稱-文件中的所有字符,直到(但不包括)最后一個點字符。 ```cpp QString fileName = fileinfo.fileName(); ``` `fileName()`方法返回文件名,該文件名是基本名稱和擴展名。 ```cpp QString suffix = fileinfo.suffix(); ``` `suffix()`方法返回文件結尾,該結尾由文件中所有字符組成,該文件之后(但不包括)最后一個點字符。 ```cpp QString compSuffix = fileinfo.completeSuffix(); ``` 文件結尾可能由幾部分組成。 `completeSuffix()`方法返回第一個點字符之后(但不包括)后的文件中的所有字符。 ```cpp $ ./file_path ~/Downloads/qt-everywhere-opensource-src-4.8.7.tar.gz Absolute file path: /home/janbodnar/Downloads/qt-everywhere-opensource-src-4.8.7.tar.gz Base name: qt-everywhere-opensource-src-4 Complete base name: qt-everywhere-opensource-src-4.8.7.tar File name: qt-everywhere-opensource-src-4.8.7.tar.gz Suffix: gz Whole suffix: 8.7.tar.gz ``` 這是程序的輸出。 ## 權限 文件系統中的文件具有保護系統。 文件帶有標志,這些標志確定誰可以訪問和修改它們。 `QFile::permissions()`方法返回有關文件的 OR-ED 標志的枚舉。 `permissions.cpp` ```cpp #include <QTextStream> #include <QFile> int main(int argc, char *argv[]) { QTextStream out(stdout); if (argc != 2) { out << "Usage: permissions file" << endl; return 1; } QString filename = argv[1]; QFile::Permissions ps = QFile::permissions(filename); QString fper; if (ps & QFile::ReadOwner) { fper.append('r'); } else { fper.append('-'); } if (ps & QFile::WriteOwner) { fper.append('w'); } else { fper.append('-'); } if (ps & QFile::ExeOwner) { fper.append('x'); } else { fper.append('-'); } if (ps & QFile::ReadGroup) { fper.append('r'); } else { fper.append('-'); } if (ps & QFile::WriteGroup) { fper.append('w'); } else { fper.append('-'); } if (ps & QFile::ExeGroup) { fper.append('x'); } else { fper.append('-'); } if (ps & QFile::ReadOther) { fper.append('r'); } else { fper.append('-'); } if (ps & QFile::WriteOther) { fper.append('w'); } else { fper.append('-'); } if (ps & QFile::ExeOther) { fper.append('x'); } else { fper.append('-'); } out << fper << endl; } ``` 該示例為給定文件生成類似 Unix 的權限列表。 有幾種可能的用戶類型:所有者,文件所屬的組以及其余的稱為其他用戶。 前三個位置屬于文件的所有者,后三個位置屬于文件的組,后三個字符屬于其他字符。 權限共有四種:讀取(`r`),寫入或修改(`w`),執行(`x`)和無權限(`-`)。 ```cpp QFile::Permissions ps = QFile::permissions(filename); ``` 通過`QFile::permissions()`方法,我們獲得了權限標志的枚舉。 ```cpp QString fper; ``` 該字符串是根據給定的權限動態構建的。 ```cpp if (ps & QFile::ReadOwner) { fper.append('r'); } else { fper.append('-'); } ``` 我們使用&運算符確定返回的枚舉是否包含`QFile::ReadOwner`標志。 ```cpp $ ./permissions Makefile rw-rw-r-- ``` 文件所屬的所有者和用戶組有權讀取和修改文件。 其他用戶有權讀取該文件。 由于該文件不是可執行文件,因此沒有執行該文件的權限。 ## 列出目錄內容 在下面的示例中,我們顯示給定目錄的內容。 `list_dir.cpp` ```cpp #include <QTextStream> #include <QFileInfo> #include <QDir> int main(int argc, char *argv[]) { QTextStream out(stdout); if (argc != 2) { qWarning("Usage: list_dir directory"); return 1; } QString directory = argv[1]; QDir dir(directory); if (!dir.exists()) { qWarning("The directory does not exist"); return 1; } dir.setFilter(QDir::Files | QDir::AllDirs); dir.setSorting(QDir::Size | QDir::Reversed); QFileInfoList list = dir.entryInfoList(); int max_size = 0; foreach (QFileInfo finfo, list) { QString name = finfo.fileName(); int size = name.size(); if (size > max_size) { max_size = size; } } int len = max_size + 2; out << QString("Filename").leftJustified(len).append("Bytes") << endl; for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); QString str = fileInfo.fileName().leftJustified(len); str.append(QString("%1").arg(fileInfo.size())); out << str << endl; } return 0; } ``` 要列出目錄的內容,我們使用`QDir`類及其`entryInfoList()`方法。 文件列表按其大小反向排序,并且排列整齊。 有兩列; 第一列包含文件名,第二列包含文件大小。 ```cpp QDir dir(directory); ``` 創建具有給定目錄名稱的`QDir`對象。 ```cpp dir.setFilter(QDir::Files | QDir::AllDirs); ``` `setFilter()`方法指定`entryInfoList()`方法應返回的文件類型。 ```cpp dir.setSorting(QDir::Size | QDir::Reversed); ``` `setSorting()`方法指定`entryInfoList()`方法使用的排序順序。 ```cpp QFileInfoList list = dir.entryInfoList(); ``` `entryInfoList()`方法返回目錄中所有文件和目錄的`QFileInfo`對象的列表,并通過過濾和排序方法進行過濾和排序。 `QFileInfoList`是`QList<QFileInfo>`的同義詞。 ```cpp foreach (QFileInfo finfo, list) { QString name = finfo.fileName(); int size = name.size(); if (size > max_size) { max_size = size; } } ``` 我們遍歷列表并確定最大文件名大小。 需要此信息來整齊地組織輸出。 ```cpp int len = max_size + 2; ``` 我們在列的長度上再加上兩個空格。 ```cpp out << QString("Filename").leftJustified(len).append("Bytes") << endl; ``` 在這里,我們打印列名。 `leftJustified()`方法返回給定大小的字符串,該字符串左對齊并在其右邊用填充字符(默認為空格)填充。 ```cpp for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); QString str = fileInfo.fileName().leftJustified(len); str.append(QString("%1").arg(fileInfo.size())); out << str << endl; } ``` 我們瀏覽文件列表并打印它們的名稱和大小。 第一列保持對齊,并在必要時用空格填充; 僅將第二列添加到該行的末尾。 ```cpp $ ./list_dir . Filename Bytes list_dir.pro 302 list_dir.cpp 1092 .. 4096 . 4096 Makefile 7456 list_dir.o 8848 list_dir 14687 ``` 這是示例的示例輸出。 在本章中,我們使用文件和目錄。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看