2011-01-27 20 views
0

FindFirstFile win32函數失敗。請解決問題。由於FindFirstFile按預期工作

#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; 
} 
+1

也許你可以解釋它爲什麼失敗,任何錯誤消息等等。 – 2011-01-27 19:50:53

+7

如果「無效句柄正在返回」是你的問題,調用GetLastError(),你會知道它爲什麼失敗。 – nos 2011-01-27 19:56:33

回答

1

問題得到解決我的項目設置爲UNICODE,我路過一個ASCI字符串,用FindFirstFile失敗。謝謝你的建議

1

如果你有問題與unicode ascii然後你可以使用另一個Windows API轉換之前,你傳遞給函數。這在我的C應用程序完美工作時,我試圖用一個ASCII路徑(簡化的解釋代碼)使用用FindFirstFile:

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

你正在使用的char *作爲參數。首先,您需要將它轉換爲寬字符而不是FindFirstFile和FindNextFile函數。使用預處理器定義的API調用,而不是他們的直接符號

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; 

    } 

} 
0

在未來,任何人:

#define FindFirstFile FindFirstFileA/W

應該使用預處理的typedef作爲參數

typedef LPCTSTR LPC(W)STR

TCHAR在WINAPI中被調用的原因是人!如果您正在編寫代碼以便在任何IDE中移植(例如在github上粘貼代碼)。使用TCHAR's,LPCTSTR將與FindFirstFileA/W一起使用。

或者只是使用明確的API表示法FindFirstFileW(在這種情況下,因爲您期待系統文件名,並且它們具有unicode字符,並且默認系統字符集未設置爲正確的代碼庫,您將在輸出緩衝區中獲取「垃圾/垃圾」字符)。

另一個側面說明,如果你與系統文件或系統路徑工作,始終使用Unicode因爲ANSI直接依賴於代碼庫,如果你是一個阿拉伯語系統上,文件路徑將會被搞砸ANSI