2015-09-26 87 views
0

我想列出文件夾「C:\ home \ WORK \ Desktop \ Communication」中的文件。該文件夾中有十個文件。我的代碼沒有錯誤,但沒有打印任何內容。我的錯誤是什麼?聲明之後在Windows中使用C列出文件夾中的文件

#include<stdio.h> 
#include<Windows.h> 
#include<string.h> 

int main(int argc,char *argv[]) 
{ 
    char path[]="C:\\home\\WORK\\Desktop\\Communication"; 
    strcat_s(path,sizeof(path),"\\*"); 

    WIN32_FIND_DATA fdata; 
    HANDLE hFind =INVALID_HANDLE_VALUE; 
    int numberOfFiles=0; 
    char *files[10]; 

hFind = FindFirstFile(path,&fdata); 

while((FindNextFile(hFind,&fdata))!=0) 
    { 
    files[numberOfFiles]=fdata.cFileName; 
    numberOfFiles++; 
    printf("%s\n",files[numberOfFiles]); 

    } 

    FindClose(hFind); 

    return 0; 
} 

回答

0

清除fdata結構:

memset(&fdata, 0, sizeof fdata) 
1

看來,你應該將

numberOfFiles++ 

過去

printf("%s\n",files[numberOfFiles]); 

或者

while((FindNextFile(hFind,&fdata))!=0) 
{ 
    files[numberOfFiles]=fdata.cFileName; 
    printf("%s\n", files[numberOfFiles++]); 
} 

這是一樣的

while((FindNextFile(hFind,&fdata))!=0) 
{ 
    printf("%s\n", files[numberOfFiles++] = fdata.cFileName); 
} 

我不知道WinAPI的好,但我覺得,所有的files將包含FindClose(hFind)以及對files所有元素後無效指針將指向*(fdata.cFileName)哪些將在FindClose(hFind)發佈。換句話說,據我所知,你應該複製(或重複fdata.cFileNamefiles[i]每次迭代。

2

你的代碼有幾個錯誤。

  1. strcat_s不能追加"\\*"path字符數組。緩衝區只有足夠的空間存儲字符串文字。
  2. 我很不舒服,讓你聲明一個緩衝區files只有足夠的內存來適應所有的文件名。如果你添加一個文件會發生什麼?然後緩衝區溢出。但是,在這種情況下它仍然會在技術上起作用。
  3. 此行printf("%s\n",files[numberOfFiles]);是未定義的行爲。您將numberOfFiles遞增到數組中尚未初始化的位置,因此它不打印文件名。
  4. 當您致電FindClose時,您將使存儲在files中的所有指針無效。你不能再使用它們。您需要將字符串複製到新的緩衝區。

以下代碼有效。

#include<stdio.h> 
#include<Windows.h> 
#include<string.h> 

int main(int argc,char *argv[]) 
{ 
    char path[] = "C:\\home\\WORK\\Desktop\\Communication\\*.*"; 
    //strcat_s(path,sizeof(path),"\\*"); 

    WIN32_FIND_DATA fdata; 
    HANDLE hFind =INVALID_HANDLE_VALUE; 
    int numberOfFiles=0; 
    char* files[10]; /* you may want to expand this buffer */ 

    hFind = FindFirstFile(path,&fdata); 

    while((FindNextFile(hFind,&fdata))!=0) 
    { 
     size_t len = strlen(fdata.cFileName); 
     files[numberOfFiles] = malloc(len + 1 * sizeof*files); // len + 1 for null-terminator 
     strcpy_s(files[numberOfFiles], len, fdata.cFileName); 

     printf("%s\n",files[numberOfFiles]); 
     numberOfFiles++; /* increment this AFTER you print files[numberOfFiles] */ 
    } 

    FindClose(hFind); 

    for(int i = 0; i < (sizeof(file)/sizeof(*file)); ++i) { 
     free(file[i]); 
    } 

    return 0; 
} 
相關問題