關於qt操作資料夾、檔案的知識用途較多,比如遍歷下一層乃至所有子孫檔案、資料夾,獲取它們的一些資訊(大小、型別、最後更改時間等)。當然,也可以進行級聯刪除。
首先看簡單的:
方式1:
void imagetree::
addfolderimages(qstring path)
dir.setfilter(qdir::files | qdir::nosymlinks);
qfileinfolist list = dir.entryinfolist();
int file_count = list.count();
if(file_count <= 0)
qstringlist string_list;
for(int i=0; i
} }
entryinfolist則可以獲取過濾後所得到的資料夾下的檔案資訊列表,遍歷檔案通過操作qfileinfo可得到所需的檔案詳細資訊(大小、型別、字尾等)。
方式2:
void imagetree::addfolderimages(qstring path)
qstringlist filters;
filters<
dir.setfilter(qdir::files | qdir::nosymlinks); //設定型別過濾器,只為檔案格式
dir.setnamefilters(filters);
//設定檔名稱過濾器,只為filters格式(字尾為.jpeg等格式)
int dir_count = dir.count();
if(dir_count <= 0)
qstringlist string_list;
//獲取分隔符
//qchar separator = qdir::separator();
qchar separator = qchar('/');
if(!path.contains(separator))
qchar last_char = path.at(path.length()-1);
if(last_char == separator)
for(uint i=0; i
//string_list 新增完成之後,就可以檢視list中的檔案路徑了 }
分析:setnamefilters顧名思義,就是過濾檔名稱的。如果只需要獲取指定路徑下的檔名,則可去掉「獲取分隔符」部分**(因為我是為了獲取檔案的全路徑)。
思考:qdir::separator()這是用於獲取分隔符的,除錯過程中發現path的分隔符為'/',奇怪的是獲取到的為'\\',剛好相反,所以我通過contains的方式獲取分隔符的(無非'/'與'\\')。
討論:如果設定filters後,那麼存在一定的問題。熟用windows的應該都知道,檔名是忽略大小寫的(包括副檔名),那麼若filters設定了「*.jpg」之後,則就不可新增擴充套件名為「.jpg」、「.jpg」等大小寫兼有的檔案了。
既然有問題,就有解決問題的方式。
1、問題**是由副檔名引起,那麼去掉setnamefilters(filters);
2、上述已經獲取檔案全路徑,那麼qfileinfo file_info(file_path)獲取檔案資訊的物件
3、通過file_info.suffix()或者completesuffix()來判定檔案的字尾、副檔名
4、獲取之後比較時忽略大小寫即可。如:qstring::compare(suffix,
qstring("*.jpeg"), qt::caseinsensitive) == 0
二、級聯遍歷資料夾及其子孫資料夾中的檔案
方式1:
void imagetree::addsubfolderimages(qstring path)
//獲取所選檔案型別過濾器
qstringlist filters;
filters<
//定義迭代器並設定過濾器
qdiriterator dir_iterator(path,
filters,
qdir::files | qdir::nosymlinks,
qdiriterator::subdirectories);
qstringlist string_list;
while(dir_iterator.hasnext())
} 分析:qdiriterator定義過程中可設定過濾器,包括:檔名稱、檔案型別等。dir_iterator.next()這句話很重要,如果缺少將會進入死迴圈!
方式2:
qstringlist string_list;
void imagetree::
addsubfolderimages(qstring path)
dir.setfilter(qdir::dirs | qdir::files
| qdir::nosymlinks);
dir.setsorting(qdir::dirsfirst);
qfileinfolist list = dir.entryinfolist();
int i = 0;
bool is_dir; do
is_dir =
file_info.isdir();
if(is_dir)
else
} i++; }
while(i }
分析:此方式採用遞迴的思路解決,也是網上大多數人用的辦法,個人建議摒棄!遞迴的效率真心不敢接受,而且**看起來也費勁。
總結:通過以上兩種方式比較,關於遍歷子孫資料夾的方式,採用「方式1」較好。
關於qfileinfo獲取檔案資訊的方法可以檢視api
方法如下:
void setfile(const qstring &file);
void setfile(const qfile &file);
void setfile(const qdir &dir, const qstring &file);
bool exists() const;
void refresh();
qstring filepath() const;
qstring absolutefilepath() const;
qstring canonicalfilepath() const;
qstring filename() const;
qstring basename() const;
qstring completebasename() const;
qstring suffix() const;
qstring bundlename() const;
qstring completesuffix() const;
qstring path() const;
qstring absolutepath() const;
qstring canonicalpath() const;
qdir dir() const;
qdir absolutedir() const;
bool isreadable() const;
bool iswritable() const;
bool i***ecutable() const;
bool ishidden() const;
bool isnativepath() const;
bool isrelative() const;
inline bool isabsolute() const
bool makeabsolute();
bool isfile() const;
bool isdir() const;
bool issymlink() const;
bool isroot() const;
bool isbundle() const;
qstring readlink() const;
inline qstring symlinktarget() const
qstring owner() const;
uint ownerid() const;
qstring group() const;
uint groupid() const;
bool permission(qfile::permissions permissions) const;
qfile::permissions permissions() const;
qint64 size() const;
qdatetime created() const;
qdatetime lastmodified() const;
qdatetime lastread() const;
bool caching() const;
void setcaching(bool on);
原文:
Qt之遍歷資料夾(經典詳解)
關於qt操作資料夾 檔案的知識用途較多,比如遍歷下一層乃至所有子孫檔案 資料夾,獲取它們的一些資訊 大小 型別 最後更改時間等 當然,也可以進行級聯刪除。首先看簡單的 一 qt遍歷資料夾下一層的檔案 方式1 void imagetree addfolderimages qstring path di...
Qt遍歷資料夾
關於qt操作資料夾 檔案的知識用途較多,比如遍歷下一層乃至所有子孫檔案 資料夾,獲取它們的一些資訊 大小 型別 最後更改時間等 當然,也可以進行級聯刪除。首先看簡單的 一 qt遍歷資料夾下一層的檔案 方式1 void imagetree addfolderimages qstring path di...
QT 遍歷資料夾
qstring dir path e checked qdir dir dir path qfileinfolist fileinfolist dir.entryinfolist qdir files 設定過濾器 qdir files 得到該目錄下所有檔案 qdir dirs 得到該目錄下所有子資料...