文件夹遍历

http://www.cppblog.com/shongbee2/archive/2009/03/30/78366.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364418%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364428%28v=vs.85%29.aspx

用windows的API实现文件夹的遍历扫描的程序
使用到的API:

1
2
3
FindFirstFile
FindNextFile
FindClose

主要用到的结构:

1
WIN32_FIND_DATA

在msdn都有详细的说明。这里也简要说明一下:

1
2
3
4
HANDLE WINAPI FindFirstFile(
__in LPCTSTR lpFileName, //要查找的文件路径
__out LPWIN32_FIND_DATA lpFindFileData //保存文件结构的指针
);

查找对应的路径,如果查找返回查找的句柄,然后我们可以通过该句柄去查找下一个和关闭这个句柄。
如果查找失败,则返回(INVALED_HANDLE_VALUE)(-1),可以通过GetLastError();来得到他的错误类型。
注意:查找第一个的时候,他不仅返回了查找的句柄,他也把第一个的文件信息保存在lpFindFileData里面了。所以这个也是要处理的。


例程:
头文件包含:

1
2
#include <windows.h>
#include <winbase.h> // 在这里定义
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
#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

#include <windows.h>
#include <winbase.h> // 在这里



int main()
{

// HANDLE WINAPI FindFirstFile(
// _In_ LPCTSTR lpFileName, // C风格字符串 名
// _Out_ LPWIN32_FIND_DATA lpFindFileData // 指向接收信息的结构体的指针
// );

// 关于返回值
// 成功, 则返回用来继续查找或者关闭用的句柄
//
// 失败,则返回 INVALID_HANDLE_VALUE 并且结构体内容是不确定的
// 获取更多信息在 GetLastError 函数
//
// 如果没有找到文件 GetLastError 函数会返回 ERROR_FILE_NOT_FOUND

// 关于第一个参数
// The directory or path, and the file name, which can include wildcard characters,
// for example, an asterisk (*) or a question mark (?).
//
// This parameter should not be NULL, an invalid string
// (for example, an empty string or a string that is missing the terminating null character),
// or end in a trailing backslash ().
//
// If the string ends with a wildcard, period (.),
// or directory name,
// the user must have access permissions to the root and all subdirectories on the path.
//
// In the ANSI version of this function, the name is limited to MAX_PATH characters.
// To extend this limit to 32,767 wide characters,
// call the Unicode version of the function and prepend "\?" to the path.


// BOOL WINAPI FindNextFile(
// _In_ HANDLE hFindFile, // 上一个函数的返回句柄
// _Out_ LPWIN32_FIND_DATA lpFindFileData
// );
// 失败返回false【没有下一个??】 并且结构体返回内容不确定
// 具体失败信息查看 GetLastError

// BOOL WINAPI FindClose(
// _Inout_ HANDLE hFindFile // 关闭句柄
// );

// 结构体内容
// typedef struct _WIN32_FIND_DATA {
// DWORD dwFileAttributes;
// FILETIME ftCreationTime;
// FILETIME ftLastAccessTime;
// FILETIME ftLastWriteTime;
// DWORD nFileSizeHigh;
// DWORD nFileSizeLow;
// DWORD dwReserved0;
// DWORD dwReserved1;
// CHAR cFileName[MAX_PATH];
// CHAR cAlternateFileName[14];
// } WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;

// DWORD WINAPI GetLastError(void);
// 返回上一个错误代码

WIN32_FIND_DATA FindFileData;
LPWIN32_FIND_DATA lpFindFileData = &FindFileData;

string path = ".\png\*.png";

HANDLE handle = FindFirstFile( path.c_str(), lpFindFileData );

if ( INVALID_HANDLE_VALUE == handle )
{
cout << "INVALID_HANDLE_VALUE" << endl;
cin.get();
return -1;
}

do{
if ( !( lpFindFileData->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
{
cout << lpFindFileData->cFileName < < endl;
}
int t = GetLastError();
// cout << "GetLastError " << t << endl;
if ( ERROR_FILE_NOT_FOUND == t )
{
cout << "ERROR_FILE_NOT_FOUND" << endl;
}
}while ( FindNextFile( handle, lpFindFileData ) );

if ( !FindClose(handle) )
{
cout << "CloseFail" << endl;
return -1;
}

cin.get();

return 0;
}