最新修改的代码,见http://www.cnblogs.com/farewell-farewell/p/7197644.html
头文件:#include <windows.h>
//FindFirstFile() 获得指定目录的第一个文件 HANDLE FindFirstFile( LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData ); /* lpFileName 是搜索目录的名称,注意: 需要用转义字符表达。(”E:\Folder\“) lpFindFileData 指向一个用于保存文件信息的结构体。 返回值 调用成功返回HANDLE类型,可用来做为FindNextFile或 FindClose参数; 调用失败 返回为INVALID_HANDLE_VALUE(即-1) ,可调用GetLastError来获取错误信息。
*/
//FindNextFile()判断当前目录下是否有下一个目录或文件 bool FindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData ); /* HANDLE hFindFile 搜索的文件句柄 函数执行的时候搜索的是此句柄的下一文件 LPWIN32_FIND_DATA lpFindFileData 指向一个用于保存文件信息的结构体 返回值 非零表示成功,零表示失败。如不再有与指定条件相符的文件,会将GetLastError设置成ERROR_NO_MORE_FILES */
PS: lpFindFileData用于获取文件信息。通常,最初的两次搜索得到的文件名为:"." 、"..",分别代表当前目录和上级目录。遍历文件时要注意这两个目录。
上述函数的属性解析:
1. HANDLE(句柄)
是Windows操作系统中的一个概念。在Windows程序中,有各种各样的资源(窗口、图标、光标等),系统在创建这些资源时会为它们分配内存,并返回标示这些资源的标示号,即句柄。句柄指的是一个核心对象在某一个进程中的唯一索引,而不是指针。由于地址空间的限制,句柄所标识的内容对进程是不可见的,只能由操作系统通过进程句柄列表来进行维护。句柄列表:每个进程都要创建一个句柄列表,这些句柄指向各种系统资源,比如信号量,线程和文件等,进程中的所有线程都可以访问这些资源。
无效的返回值为: INVALID_HANDLE_VALUE
PS:HANDLE是一个通用句柄表示,HWND是一个专用表示窗口的句柄。
2.LPCTSTR
用来表示字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。
LPCTSTR表示一个指向const对象的指针。
3.LPWIN32_FIND_DATA
WIN32_FIND_DATA的指针。LP表示long pointer的意思。
long pointer的含义(摘):
Some processors have two types of pointers, a near pointer and a far pointer. The near pointer is narrower (thus has a limited range) than a far pointer. A far pointer may also be a long pointer. Some processors offer relative addressing for things nearby. A long pointer may indicate that the item is not close by and relative addressing cannot be used. In any case, long pointers are a platform specific issue and may not be portable to other OSes or platforms.
以下为WIN32_FIND_DATA结构体:
typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; // 文件属性 FILETIME ftCreationTime; // 文件创建时间 FILETIME ftLastAccessTime; // 文件最后一次访问时间 FILETIME ftLastWriteTime; // 文件最后一次修改时间 DWORD nFileSizeHigh; // 文件长度高 32 位 DWORD nFileSizeLow; // 文件长度低 32 位 DWORD dwReserved0; // 系统保留 DWORD dwReserved1; // 系统保留 TCHAR cFileName[ MAX_PATH ]; // 长文件名 TCHAR cAlternateFileName[ 14 ]; // 文件的可选名 } WIN32_FIND_DATA;
程序示例:
读取三个文件夹下的文件
#include <opencv2/opencv.hpp> #include <iostream> #include <stdlib.h> #include <windows.h> using namespace std; string getstring(const int n) { stringstream str; str << n; return str.str(); } wchar_t* CharToWchar(const char* c) { wchar_t *m_wchar; int len = MultiByteToWideChar(CP_ACP, 0, c, strlen(c), NULL, 0); m_wchar = new wchar_t[len + 1]; //映射一个字符串到一个宽字符(unicode)的字符串 MultiByteToWideChar(CP_ACP, 0, c, strlen(c), m_wchar, len); m_wchar[len] = '