FindFirstFile()函数用法 请教高手

时间:2021-07-23 18:55:16
最近用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 函数怎么检测文件的存在与否?

15 个解决方案

#1


FindFirstFileA()  一个ASCII
FindFirstFileW( ) 个是nuicode 宽字符集

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

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





#2


有没有高手回答清楚一点
拜托

#3


1.1楼回答了

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

3.就是用CFileFind啊

#4


建议你看下上面网页那篇文章

#5


在预编译选项里设置unicode还是多字符集
WideCharToMultiByte
MultiByteToWideChar

#6


建议先看一下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);
}

#7


to yztgx(静风)
上叙程序,编译时有问题:error C2664: “FindFirstFileW”: 不能将参数 1 从“char *”转换为“LPCWSTR”

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

那么对于这一问题该怎么解决了?

#8


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尝试着打开文件,如果不存在,会返回结果指示的。

#9


在要使用LPCWSTR的地方,用L"aaaaaa"形式, 比如你应该使用L"filepath".

#10


Thanks very much,I understand now!!!

#11


不好意思,分数有限,就这样给吧,真的很感谢大家哦!

#12


最近用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就存在呗

#13


Thank you.

#14


mark

#15


不错,很有用,记下了

#1


FindFirstFileA()  一个ASCII
FindFirstFileW( ) 个是nuicode 宽字符集

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

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





#2


有没有高手回答清楚一点
拜托

#3


1.1楼回答了

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

3.就是用CFileFind啊

#4


建议你看下上面网页那篇文章

#5


在预编译选项里设置unicode还是多字符集
WideCharToMultiByte
MultiByteToWideChar

#6


建议先看一下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);
}

#7


to yztgx(静风)
上叙程序,编译时有问题:error C2664: “FindFirstFileW”: 不能将参数 1 从“char *”转换为“LPCWSTR”

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

那么对于这一问题该怎么解决了?

#8


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尝试着打开文件,如果不存在,会返回结果指示的。

#9


在要使用LPCWSTR的地方,用L"aaaaaa"形式, 比如你应该使用L"filepath".

#10


Thanks very much,I understand now!!!

#11


不好意思,分数有限,就这样给吧,真的很感谢大家哦!

#12


最近用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就存在呗

#13


Thank you.

#14


mark

#15


不错,很有用,记下了