FindFirstFile win32函数失败。请解决问题。感谢
#include<Windows.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define ValidDir(data) strcmp(data.cFileName,".")&&strcmp(data.cFileName,"..")
void MergeDir(char *path)
{
WIN32_FIND_DATA data={0};
HANDLE h;
int nFiles,i=0;
char temp[MAX_PATH];
char **files = malloc(sizeof(char*)*10000);
sprintf(temp,"%s*.*",path);//path = c:\windows name = *.*
h = FindFirstFile(temp,&data);//temp = c:\windows\*.*
/Invalid handle is being returned.....
if(h != INVALID_HANDLE_VALUE){ //Check whether we got valid handle or not
i = 0;
do{
if(ValidDir(data)){//Checks whether the Dir is . or ..
files[i] = malloc(sizeof(char)*MAX_PATH);
sprintf(files[i++],"%s%s",path,data.cFileName);
}
}while(FindNextFile(h,&data));
nFiles = --i;
FindClose(h);
for(i = 0; nFiles > 0 && i < nFiles-1; i++){
printf("\n%s\n%s\n----------------",files[i],files[i+1]);
}
}
}
int main()
{
//list all files in the following directory
MergeDir("D:\\IIIT\\Sem2\\IRE\\Processed\\");
return 0;
}
答案 0 :(得分:1)
问题解决了我的项目设置为UNICODE并且我传递了一个asci字符串,因此FindFirstFile失败了。谢谢你的建议
答案 1 :(得分:1)
如果您遇到ascii到unicode的问题,那么您可以在传入函数之前使用另一个Windows API进行转换。当我尝试使用带有ascii路径的FindFirstFile时,这在我的C应用程序中完美地工作(代码被简化以便解释):
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
char searchName[_MAX_PATH];
char resultName[_MAX_PATH];
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
WCHAR wSearchName[_MAX_PATH];
// the path is made from inputs, looks like "path\to\folder\*.extension"
// the path is stored in searchName
// encode string for search
MultiByteToWideChar(CP_UTF8, 0, searchName, _MAX_PATH, wSearchName, _MAX_PATH);
hFind = FindFirstFile(wSearchName, &FindFileData);
while (hFind != INVALID_HANDLE_VALUE)
{
//convert result name back to ascii and do something with it
WideCharToMultiByte(CP_UTF8, 0, FindFileData.cFileName, _MAX_PATH, resultName, _MAX_PATH, NULL, NULL);
// do something with result
// keep moving to next files
if (!FindNextFile(hFind, &FindFileData))
{
FindClose(hFind);
hFind = INVALID_HANDLE_VALUE;
}
}
答案 2 :(得分:0)
您使用char *作为参数。首先,您需要将其转换为宽字符,而不是转到FindFirstFile和FindNextFile函数。
void MergeFile(char * s_Path){
wchar_t *w_Path = (wchar_t *)malloc(strlen(s_Path) * sizeof(wchar_t));
mbstowcs(w_Path,s_Path,strlen(s_Path) + 1);
WIN32_FIND_DATA fd;
LPCWSTR m_Path = w_Path;
memset(&fd,0,sizeof(WIN32_FIND_DATA));
HANDLE hfile = FindFirstFile(m_Path,&fd);
while(hfile != INVALID_HANDLE_VALUE)
{
if(fd.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
{
printf("\n %S",fd.cFileName);
}
if(FindNextFile(hfile,&fd)==false) break;
}
}
答案 3 :(得分:0)
将来,任何使用预处理器定义进行API调用的人都不是直接符号:
#define FindFirstFile FindFirstFileA/W
应该使用预处理器typedef作为参数
typedef LPCTSTR LPC(W)STR
TCHAR
!如果您编写的代码可以在任何人的IDE中移植(例如,在github上粘贴代码)。使用TCHAR
,LPCTSTR
将同时使用FindFirstFileA/W
。
或者只是使用显式API表示法FindFirstFileW
(在这种情况下,因为您需要系统文件名,如果它们有unicode字符,并且默认系统字符集未设置为正确的代码库,您将在输出缓冲区中获得&#34;垃圾/垃圾&#34;字符。)
另一方面,如果您正在使用系统文件或系统路径,请始终使用Unicode
,因为ANSI
直接依赖于代码库,如果您正在使用阿拉伯语系统,文件路径将在ANSI
中搞砸。