FindFirstFile не работает должным образом - PullRequest
0 голосов
/ 27 января 2011

Сбой функции 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 ]

1 голос
/ 10 июня 2014

Если у вас возникли проблемы с ascii в unicode, вы можете использовать другой Windows API для преобразования перед переходом в функцию. Это прекрасно работало в моем C-приложении, когда я пытался использовать FindFirstFile с путем ascii (код упрощен для объяснения):

#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;
    }
}
1 голос
/ 29 января 2011

Проблема была решена, мой проект настроен на UNICODE, и я передаю строку asci, поэтому FindFirstFile терпит неудачу.Спасибо за ваши предложения

0 голосов
/ 10 февраля 2017

В будущем любой, кто использует определения препроцессора для вызовов API, а не их прямую запись:

#define FindFirstFile FindFirstFileA/W

должен использовать препроцессор typedef в качестве параметра

typedef LPCTSTR LPC(W)STR

TCHAR вызывается в WINAPI по определенной причине, люди!Если вы пишете код для переносимости в чьей-либо IDE (например, вставьте код на github).Используйте TCHAR, LPCTSTR будет работать с обоими FindFirstFileA/W.

Или просто использовать явную нотацию API, FindFirstFileW (в этом случае, когда вы ожидаете имена системных файлов, и еслиони имеют символы Юникода, а системная кодировка по умолчанию не установлена ​​на правильную базу кода, вы получите символы «мусор / мусор» в выходном буфере).

Еще одно замечание, если вы работаетес системным файлом или системным путем всегда используйте Unicode, поскольку ANSI напрямую зависит от базы кода, а если вы работаете в арабской системе, путь к файлу будет запутан в ANSI.

0 голосов
/ 10 февраля 2017

вы используете 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;

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...