FindFirstFile()函数用法 请教高手

harrybinhu 2007-09-05 10:24:44
最近用FindFirst()检测文件的存在性总是失败,有以下几个问题望高手们回答一下:
1,在Vs2005中关于FindFirst()函数用两种FindFirstFileA(),FindFirstFileW(),定义于Winbase.h中.而在VS20005的MSDN中却只有一种(其实就是FindFirstFileW()),请问两个函数干嘛的,有什么区别.
2,对于LPCTSTR,LPCWSTR,LPCSTR它们与char的关系,能不能直接用强制转化如:(LPCWSTR)"filepath).
看了半天MSDN还是不懂what is the "String Conversion Macros"?
3,用Windows ATI 函数怎么检测文件的存在与否?
...全文
2900 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
明文存密码 2010-09-03
  • 打赏
  • 举报
回复
不错,很有用,记下了
icthuang85 2009-12-29
  • 打赏
  • 举报
回复
mark
coolFly19 2007-09-05
  • 打赏
  • 举报
回复
在要使用LPCWSTR的地方,用L"aaaaaa"形式, 比如你应该使用L"filepath".
coolFly19 2007-09-05
  • 打赏
  • 举报
回复
FindFirstFileA 是ASCII版的,简单的说,不能有中文在参数中,而FindFirstFileW是Unicode版的,它可以包含非ASCII的参数,但是即使包含ASCII中的那些字符,那也得2个byte表示一个字符。

LPCTSTR, const TCHAR*; 除了编译器字符集设置,一般情况下要看你是否指定UNICODE宏,指定TCHAR就代表wchar_t, 否则char.
LPCWSTR= const wchar_t*;
LPCSTR= const char*;
不能直接用强制转化如:(LPCWSTR)"filepath).因为他们不是一种字符类型,因为typedef unsigned short wchat_t;

你使用CreateFile or OpenFile尝试着打开文件,如果不存在,会返回结果指示的。
harrybinhu 2007-09-05
  • 打赏
  • 举报
回复
to yztgx(静风)
上叙程序,编译时有问题:error C2664: “FindFirstFileW”: 不能将参数 1 从“char *”转换为“LPCWSTR”

如改为: hFind=FindFirstFile((LPCWSTR)argv[1],&FindFileData);
可以运行,但存在的文件也被检测为不存在。
说明(LPCWSTR)强制转化出了问题.

那么对于这一问题该怎么解决了?
yztgx 2007-09-05
  • 打赏
  • 举报
回复
建议先看一下Windows核心编程,中ANSI和Unicode的区别

#ifdef UNICODE
#define FindFirstFile FindFirstFileW
#else
#define FindFirstFile FindFirstFileA
#endif // !UNICODE

LPCSTR = const char *(8-bit Windows (ANSI) )
LPCWSTR(16-bit Unicode characters)
LPCTSTR 解释An LPCWSTR if UNICODE is defined, an LPCSTR otherwise.


判断文件是否存在
用FindFirstFile就可以

#include "windows.h"

int
main(int argc, char *argv[])
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;

printf ("Target file is %s.\n", argv[1]);

hFind = FindFirstFile(argv[1], &FindFileData);

if (hFind == INVALID_HANDLE_VALUE) {
printf ("Invalid File Handle. Get Last Error reports %d\n", GetLastError ());
} else {
printf ("The first file found is %s\n", FindFileData.cFileName);
FindClose(hFind);
}

return (0);
}

ouyh12345 2007-09-05
  • 打赏
  • 举报
回复
在预编译选项里设置unicode还是多字符集
WideCharToMultiByte
MultiByteToWideChar
冷月清晖 2007-09-05
  • 打赏
  • 举报
回复
建议你看下上面网页那篇文章
冷月清晖 2007-09-05
  • 打赏
  • 举报
回复
1.1楼回答了

2.
http://www.vckbase.com/document/viewdoc/?id=1082
看那张表格

3.就是用CFileFind啊
harrybinhu 2007-09-05
  • 打赏
  • 举报
回复
有没有高手回答清楚一点
拜托
yuanhan530 2007-09-05
  • 打赏
  • 举报
回复
FindFirstFileA() 一个ASCII
FindFirstFileW( ) 个是nuicode 宽字符集

所用的字符集不一样,好像是这么说。

//刚看到。记得不是很清楚





harrybinhu 2007-09-05
  • 打赏
  • 举报
回复
Thank you.
wyjkk 2007-09-05
  • 打赏
  • 举报
回复
最近用FindFirst()检测文件的存在性总是失败,有以下几个问题望高手们回答一下:
1,在Vs2005中关于FindFirst()函数用两种FindFirstFileA(),FindFirstFileW(),定义于Winbase.h中.而在VS20005的MSDN中却只有一种(其实就是FindFirstFileW()),请问两个函数干嘛的,有什么区别.
2,对于LPCTSTR,LPCWSTR,LPCSTR它们与char的关系,能不能直接用强制转化如:(LPCWSTR)"filepath).
看了半天MSDN还是不懂what is the "String Conversion Macros"?
3,用Windows ATI 函数怎么检测文件的存在与否?
---------------------------------------
1: FindFirstFileA 和 FindFirstFileW 一个是对应Ansi字符集,一个对应Unicode字符集, 你的工程到底使用那一个决定于你的设置,是否定义了UNICODE预编译宏。FindFirstFileA 和 FindFirstFileW对外的接口统一为FindFirstFile,

#ifdef UNICODE
#define FindFirstFile FindFirstFileW
#else
#define FindFirstFile FindFirstFileA
#endif // !UNICODE

注意:FindFirstFileA是通过FindFirstFileW来实现的,就是在内部调用FindFirstFileW前后调用字符集转换程序实现的。

现在知道Windows API中总多A和W函数的区别了吧!

2:TChar 和 char的区别, 还是unicode与 ansi的区别,如果的定义了unicode TCHAR 就是WCHAR, 否则就是char。
LPCTSTR 就是long pointer of Const TChar string
LPCWSTR 就是long Pointer of Const WChar string
LPCSTR 就是Long Pointer of Const string
能不能转换,看你的工程设置,归根到底WCHAR是short,char是BYTE,TCHAR是通用数据,可以自动编译为short或BYTE

3:你的方法也可以检测啊,如果返回true就存在呗
harrybinhu 2007-09-05
  • 打赏
  • 举报
回复
不好意思,分数有限,就这样给吧,真的很感谢大家哦!
harrybinhu 2007-09-05
  • 打赏
  • 举报
回复
Thanks very much,I understand now!!!

64,677

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧