2014-10-20 77 views
0

我正在做一個任務,需要我創建一個類似於ls的函數。 我的代碼工作正常,但是當涉及到實施的從文件夾中檢索文件的屬性

ls -l child //where child is a folder 

的行爲有一個怪異的行爲。

比方說,我在文件夾「父」,並在其中我有一個子文件夾,'孩子',其中包含一些文本文件。當我從父文件夾運行我的程序時,它會找到該文件夾​​並打印出文本文件的屬性。但是,只有當父文件夾中存在相同的文件時,它纔會打印子文件夾中的文件。

下面是我使用的代碼片段,

char CurrDir[100]; 
    DIR *pDir = NULL; 
    struct dirent *pFileNames = NULL; 

    getcwd(CurrDir, sizeof(CurrDir)) 

    strncat(CurrDir, "/", strlen(CurrDir)); 

    unsigned int CurrDirLen = strlen(CurrDir); 
    unsigned int CombSize = CurrDirLen + strlen(argv[1]); 

    char SuperCharArr[CombSize]; 

    for(int i = 0; i < CombSize; ++i) 
    { 
     if(i < strlen(CurrDir)) 
      SuperCharArr[i] = CurrDir[i]; 
     else 
      SuperCharArr[i] = argv[1][i%CurrDirLen]; 
    }//for 

    //insert null character at the end of the character 
    SuperCharArr[CombSize] = '\0'; 

    pDir = opendir(SuperCharArr); 
    printf("%s\n", SuperCharArr); 

    if(pDir != NULL) 
    { 
     //Directory detected as pDir is a DirectoryStream 
     printf("%s\n", "pDir not null"); 
     PrintHeader(); 

     while((pFileNames = readdir(pDir)) != NULL) 
     { 
      PrintFileDeails(pFileNames); 
     } 
    }//if 
+1

'READDIR()'但我想它返回只有文件__name__,而不是全部__path__。換句話說,您需要先使用SuperCharArr路徑名限定'pFileNames-> d_name',然後才能使用它。 – AAT 2014-10-20 10:32:05

+0

@AAT是的,但是在每個循環中它都會返回文件名,它是您正在讀取的目錄中的每個文件的屬性,在這種情況下由pDir指針表示。不過,謝謝你的建議。 – winhung 2014-10-22 06:12:54

+0

等等,你的評論讓我檢查了一些東西,我認爲你是對的。它正在檢查錯誤的路徑。至少,在我的函數PrintFileDeails()中,它是。謝謝,我很快就會發布正確答案。 – winhung 2014-10-22 06:39:10

回答

1

在我貼在這裏的原代碼,有一個叫功能,PrintFileDeails(pFileNames),它在類型直接的參數。

在PrintFileDeails(),有可能會檢查文件的狀態和代碼如下功能,

struct stat FileStat; 

if(stat(pFileNames->d_name, &FileStat) == -1) 
{ 
    perror("stat"); 
    exit(EXIT_FAILURE); 
}//if 

這行代碼將打印出一個錯誤,他們無法找到該文件和AAT的評論使我再次通過我的代碼,因爲我懷疑它沒有讀取正確的文件夾。因此,在我通過它應該讀取文件的完整路徑之後,它工作正常。因此,代碼改爲這個。

if(stat(pFullPath, &FileStat) == -1) 
{ 
    perror("stat"); 
    exit(EXIT_FAILURE); 
}//if 

其中pFullPath才通過了包含在要搜索的文件是完整路徑SuperCharArr的變量。

手冊頁STAT()也有幫助,它可以發現here我沒有用

+0

您也可以使用dirfd()+ fstatat()而不是stat()的完整路徑。更好的原因有很多,但有點新鮮,所以便攜性較差。 – janneb 2014-10-22 08:21:10