這兩個函數均在io.h里面
一、首先了解一下一個文件結構體:
1
2
3
4
5
6
7
8
|
struct _finddata_t { unsigned attrib; time_t time_create; time_t time_access; time_t time_write; _fsize_t size; char name[260]; }; |
time_t
,其實就是long
而_fsize_t
,就是unsigned long
現在來解釋一下結構體的數據成員吧。
attrib
,就是所查找文件的屬性:
_A_ARCH(存檔)、_A_HIDDEN(隱藏)、_A_NORMAL(正常)、
_A_RDONLY(只讀)、 _A_SUBDIR(文件夾)、_A_SYSTEM(系統)。
time_create、time_access和time_write分別是創建文件的時間、最后一次訪問文件的時間和文件最后被修改的時間。
size
:文件大小
name
:文件名。
二、用 _findfirst 和 _findnext 查找文件
1、_findfirst函數:long _findfirst(const char *, struct _finddata_t *);
第一個參數為文件名,可以用"*.*"來查找所有文件,也可以用"*.cpp"來查找.cpp文件。第二個參數是_finddata_t結構體指針。若查找成功,返回文件句柄,若失敗,返回-1。
2、_findnext函數:int _findnext(long, struct _finddata_t *);
第一個參數為文件句柄,第二個參數同樣為_finddata_t結構體指針。若查找成功,返回0,失敗返回-1。
3、_findclose()函數:int _findclose(long);
只有一個參數,文件句柄。若關閉成功返回0,失敗返回-1。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
#include <io.h> #include <iostream> #include <fstream> using namespace std; bool transfer(string fileName, int exeNum ); void dfsFolder(string folderPath, ofstream &fout); int main() { _finddata_t file; int k; long HANDLE ; k = HANDLE = _findfirst( "*.*" , &file); while (k != -1) { cout << file.name << endl; k = _findnext( HANDLE , &file); } _findclose( HANDLE ); transfer( "C:\\Windows\\*.exe" , 0); ofstream o_fstream; dfsFolder( "E:\\\WHU\\Study" , o_fstream); return 0; } //_findfirst 函數返回的是匹配到文件的句柄,數據類型為long。 //遍歷過程可以指定文件類型,這通過FileName的賦值來實現,例如要遍歷C : \WINDOWS下的所有.exe文件 bool transfer(string fileName , int exeNum) { _finddata_t fileInfo; long handle = _findfirst(fileName.c_str(), &fileInfo); if (handle == -1L) { cerr << "failed to transfer files" << endl; return false ; } do { exeNum++; cout << fileInfo.name << endl; } while (_findnext(handle, &fileInfo) == 0); cout << " .exe files' number: " << exeNum << endl; return true ; } //遍歷文件夾及其子文件夾下所有文件。操作系統中文件夾目錄是樹狀結構,使用深度搜索策略遍歷所有文件。用到_A_SUBDIR屬性 //在判斷有無子目錄的if分支中,由于系統在進入一個子目錄時,匹配到的頭兩個文件(夾)是"."(當前目錄),".."(上一層目錄)。 //需要忽略掉這兩種情況。當需要對遍歷到的文件做處理時,在else分支中添加相應的代碼就好 void dfsFolder(string folderPath, ofstream &fout) { _finddata_t FileInfo; string strfind = folderPath + "\\*" ; long Handle = _findfirst(strfind.c_str(), &FileInfo); if (Handle == -1L) { cerr << "can not match the folder path" << endl; exit (-1); } do { //判斷是否有子目錄 if (FileInfo.attrib & _A_SUBDIR) { //這個語句很重要 if (( strcmp (FileInfo.name, "." ) != 0) && ( strcmp (FileInfo.name, ".." ) != 0)) { string newPath = folderPath + "\\" + FileInfo.name; dfsFolder(newPath, fout); } } else { fout<<folderPath.c_str() << "\\" << FileInfo.name << " " ; cout << folderPath.c_str() << "\\" << FileInfo.name << endl; } } while (_findnext(Handle, &FileInfo) == 0); _findclose(Handle); fout.close(); } //#include <iostream> //#include <string> //#include <io.h> //using namespace std; // //int main() //{ // _finddata_t file; // long longf; // string tempName; // //_findfirst返回的是long型; long __cdecl _findfirst(const char *, struct _finddata_t *) // if ((longf = _findfirst("E:\\WHU\\Study\\*.*", &file)) == -1l) // { // cout << "文件沒有找到!\n"; // return 0; // } // do // { // cout << "文件列表:\n"; // tempName = file.name; // if (tempName[0] == '.') // continue; // cout << file.name<<endl; // // if (file.attrib == _A_NORMAL) // { // cout << " 普通文件 "; // } // else if (file.attrib == _A_RDONLY) // { // cout << " 只讀文件 "; // } // else if (file.attrib == _A_HIDDEN) // { // cout << " 隱藏文件 "; // } // else if (file.attrib == _A_SYSTEM) // { // cout << " 系統文件 "; // } // else if (file.attrib == _A_SUBDIR) // { // cout << " 子目錄 "; // } // else // { // cout << " 存檔文件 "; // } // cout << endl; // } while (_findnext(longf, &file) == 0);//int __cdecl _findnext(long, struct _finddata_t *);如果找到下個文件的名字成功的話就返回0,否則返回-1 // // _findclose(longf); // // return 0; //} |
以上就是C++編程使用findfirst和findnext查找及遍歷文件實現示例的詳細內容,更多關于findfirst和findnext查找及遍歷文件的資料請關注服務器之家其它相關文章!
原文鏈接:https://www.cnblogs.com/ranjiewen/p/5960976.html