FindFirstFile无法按预期工作

时间:2011-01-27 19:49:22

标签: c winapi

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;
}

4 个答案:

答案 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

出于某种原因,人们在WINAPI中调用了{p> TCHAR!如果您编写的代码可以在任何人的IDE中移植(例如,在github上粘贴代码)。使用TCHARLPCTSTR将同时使用FindFirstFileA/W

或者只是使用显式API表示法FindFirstFileW(在这种情况下,因为您需要系统文件名,如果它们有unicode字符,并且默认系统字符集未设置为正确的代码库,您将在输出缓冲区中获得&#34;垃圾/垃圾&#34;字符。)

另一方面,如果您正在使用系统文件或系统路径,请始终使用Unicode,因为ANSI直接依赖于代码库,如果您正在使用阿拉伯语系统,文件路径将在ANSI中搞砸。