使用Win32 API 查找文件
最新修改的代码,见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[  ];        // 文件的可选名
  } 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, , c, strlen(c), NULL, );
m_wchar = new wchar_t[len + ];
//映射一个字符串到一个宽字符(unicode)的字符串
MultiByteToWideChar(CP_ACP, , c, strlen(c), m_wchar, len);
m_wchar[len] = '\0';
return m_wchar;
}
char* WcharToChar(const wchar_t* wp)
{
char *m_char;
//映射一个unicode字符串到一个多字节字符串
int len = WideCharToMultiByte(CP_ACP, , wp, wcslen(wp), NULL, , NULL, NULL);
m_char = new char[len + ];
WideCharToMultiByte(CP_ACP, , wp, wcslen(wp), m_char, len, NULL, NULL);
m_char[len] = '\0';
//printf("my char %s\n", m_char);
return m_char;
} wchar_t* StringToWchar(const string& s)
{
const char* p = s.c_str();
return CharToWchar(p);
} int main()
{
string Name, Path; for (int i = ; i < ; i++){ int j = ;
Path = getstring(i + ) + "/" + "*.*"; HANDLE hFile;
LPCTSTR lp = StringToWchar(Path);
WIN32_FIND_DATA pNextInfo;
hFile = FindFirstFile(lp, &pNextInfo);
if (hFile == INVALID_HANDLE_VALUE){
cout << "failed" << endl;
exit(-);//搜索失败
}
cout << "folder name:" << i + << endl; do{
//必须加这句,不然会加载.和..的文件而加载不了图片,
if (pNextInfo.cFileName[] == '.')continue; cout << "file name" << WcharToChar(pNextInfo.cFileName) << endl;
j++;
} while (FindNextFile(hFile, &pNextInfo)); system("pause");
return ;
}
WideCharToMultiByte与MultiByteToWideChar函数
int WideCharToMultiByte(
UINT CodePage, //指定执行转换的代码页
DWORD dwFlags, //允许你进行额外的控制,它会影响使用了读音符号(比如重音)的字符
LPCWSTR lpWideCharStr, //指定要转换为宽字节字符串的缓冲区
int cchWideChar, //指定由参数lpWideCharStr指向的缓冲区的字符个数
LPSTR lpMultiByteStr, //指向接收被转换字符串的缓冲区
int cchMultiByte, //指定由参数lpMultiByteStr指向的缓冲区最大值
LPCSTR lpDefaultChar, //遇到一个不能转换的宽字符,函数便会使用pDefaultChar参数指向的字符
LPBOOL pfUsedDefaultChar //至少有一个字符不能转换为其多字节形式,函数就会把这个变量设为TRUE
); /*
CodePage:指定执行转换的代码页,这个参数可以为系统已安装或有效的任何代码页所给定的值。你也可以指定其为下面的任意一值:
CP_ACP:ANSI代码页;CP_MACCP:Macintosh代码页;CP_OEMCP:OEM代码页;
CP_SYMBOL:符号代码页(42);CP_THREAD_ACP:当前线程ANSI代码页;
CP_UTF7:使用UTF-7转换;CP_UTF8:使用UTF-8转换。
*/
int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr,
int cchMultiByte, LPWSTR lpWideCharStr, int cchWideChar);
wchar_t是Unicode字符的数据类型
typedef unsigned short wchar_t;
另外,在头文件中有这样的定义:
typedef wchar_t WCHAR;
所以WCHAR实际就是wchar_t
使用Win32 API 查找文件的更多相关文章
- WIN32 API 获取文件版本信息
		CString strVersion; CString strPath(_T("xxxxxxxx.exe")); // 读文件信息 DWORD dwVerHnd = 0; DWOR ... 
- 【温故Delphi】GAEA用到Win32 API目录
		Delphi是Windows平台下著名的快速应用程序开发工具,它在VCL中封装并使用了大量的Win32 API. GAEA基于VCL开发的工具类产品,在程序中使用了大量的Win32 API,将经常用到 ... 
- WIN32读写INI文件方法
		在程序中经常要用到设置或者其他少量数据的存盘,以便程序在下一次执行的时候可以使用,比如说保存本次程序执行时窗口的位置.大小.一些用户设置的 数据等等,在 Dos 下编程的时候,我们一般自己产生一个 ... 
- win32 API函数
		cozy的博文 win32 API函数大全 (2008-03-15 16:28) 分类: 个人日记 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WN ... 
- 【C#】分享基于Win32 API的服务操作类(解决ManagedInstallerClass.InstallHelper不能带参数安装的问题)
		注:这里的服务是指Windows 服务. ------------------201508250915更新------------------ 刚刚得知TransactedInstaller类是支持带 ... 
- C#调用Win32 api学习总结
		从.NET平台调用Win32 API Win32 API可以直接控制Microsoft Windows的核心,因为API(Application Programming Interface)本来就是微 ... 
- Detours简介 (拦截x86机器上的任意的win32 API函数)
		Detours 当然是用detours,微软明显高腾讯一筹,同上,至今没失败过.写这种HOOK一定要再写个测试程序,不要直接HOOK你的目的程序,例如QQ,因为这样不方面更灵活的测试.说明一下:Det ... 
- 【.Net】从.NET平台调用Win32 API
		小序 Win32 API可以直接控制Microsoft Windows的核心,因为API(Application Programming Interface)本来就是微软留给我们直接控制 ... 
- 重温 Win32 API ----- 截屏指定窗体并打印
		朋友说在一个VC++6.0开发的项目中要增加打印窗体的功能,让帮忙写个代码供其调用. 这么老的IDE当然不想碰了,并且也不喜欢MFC笨拙不清晰的封装.所以决定採用纯Win32 API,然后用C++类简 ... 
随机推荐
- 抽空通过简书网学习了一下console,感觉高大上!
			抽空看了一下简书中关于console的文章,为了便于自己今后查看,自己写了一遍!原文地址:http://www.jianshu.com/p/f961e1a03a56 测试代码在最下面 1.consol ... 
- SATA接口硬盘加密器
			加密卡置于主板与硬盘.光驱之间,透明实时地对写入数据进行加密,对读出数据进行解密,有效防止信息被窃.未经授权的阅读和修改,以及硬盘.光盘丢失.被盗.废弃.非法用户访问而引发的敏感信息泄密问题,为用户打 ... 
- LeetCode-Divdend two Integers
			题目: Divide two integers without using multiplication, division and mod operator. 思路分析 二分法.将除数不断增倍,而结 ... 
- android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法
			android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法 SharedPreferences保存数据到xml文件 有时候要保存activity的某些状 ... 
- org.hibernate.service.jndi.JndiException: Error parsing JNDI name []
			我的hibernate.cfg.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTY ... 
- 获取本机CPU,硬盘等使用情况
			早上的时候接到主管的一个任务,要获取服务器上的cpu,硬盘, 数据库等 的使用情况,并以邮件的方式发给boss, = =没办法,公司的服务器真是不敢恭维,顺便吐槽一下公司的网速,卡的时候30k左右徘徊 ... 
- Android studio快捷键Mac版本
			为了方便大家记住这些小技巧和快捷键,我把它写成了一个插件,欢迎大家下载使用:http://chunsheng.me/EasyShortcut/ 快捷键 描述 通用------------------- ... 
- c# 高效分页只需一个dll实例
			第一.首先下载WebUIControl.dll http://pan.baidu.com/s/1gdkilDh 第二.添加引用 三.应用实例-前台代码 <%@ Register Assembly ... 
- Netbeans7.4+Weblogic11g+Spring3.2.4操作JdbcTemplate
			第一步:在Weblgic11g管理界面:http://localhost:7001/console 中建立数据源,我建立的jndi名称为:sjsstjndi 第二步:需要导入spring的以下包:使用 ... 
- HDU 2457 DNA repair (AC自动机+DP)
			题意:给N个串,一个大串,要求在最小的改变代价下,得到一个不含上述n个串的大串. 思路:dp,f[i][j]代表大串中第i位,AC自动机上第j位的最小代价. #include<algorithm ... 
