2011-11-05 111 views
2

我想列出文件和他們的大小在「第一」文件夾,但我越來越奇怪的重複每兩個文件。爲什麼文件大小會重複?

#include <stdlib.h> 
#include <stdio.h> 
#include <dirent.h> 
#include <sys/stat.h> 

struct dirent *dirPtr; 
struct stat st; 

void main() 
{ 
    DIR * dirp; 
    if((dirp=opendir("first"))==NULL) 
    { 
     printf("There has been an error"); 
    } 

    while(dirPtr=readdir(dirp)) 
    { 
     printf("%s - ", dirPtr->d_name); 
     stat(dirPtr->d_name, &st); 
     printf(" file size: %lu\n", st.st_size); 
    } 
    closedir(dirp); 
} 

這是我的輸出:

enter image description here

有誰知道爲什麼發生這種情況?

+4

'無效main' - ** ** Raaaaaaaarrrrrrrrgggggggghhhhhhhh – pmg

回答

2

對於初學者來說,你應該從查詢返回結果「的stat()」,並打印如果統計()失敗,錯誤#(而不是文件大小)。

又道: 「執行opendir()」 是從一些任意目錄讀取文件。

問:「dirPtr-> d_name」包含完整的文件路徑...或者只是一個文件名?換句話說,你是否試圖從錯誤的目錄中「stat()」?

+0

我的猜測是,STAT()返回-1。 – wildplasser

+1

剛添加: '如果(STAT(dirPtr-> d_name,&ST)== -1) { PERROR( 「STAT」); }' 和我的輸出改爲: 。 - 文件大小:4096 .. - 文件大小:4096 test.c的 - 文件大小:2566 統計:沒有這樣的文件或目錄 CProg2a.doc - 文件大小:2566 統計:沒有這樣的文件或目錄 Ç介紹.ppt - 文件大小:2566 – user1031204

+0

Kewl :)所以現在你明白了這個問題。有幾種解決方案,包括1)在stat()之前加上文件名的路徑(例如「strcpy(full_path,dirname); strcat(full_path,filename)」或2)chdir()。並且總是檢查可能失敗的函數的返回值:) – paulsm4

1

每個目錄至少有兩個條目,將當前目錄 - 單點. - 與父目錄 - 兩個點..

2

你基本上調用stat("test.c", &st)stat應該如何知道test.c在哪個目錄?我不認爲它可以。

我想你應該嘗試做stat("./first/test.c", &st)stat("/full/path/to/first/test.c", &st)。更重要的是,你應該找像stat一些函數,接受struct dirent作爲參數,所以你不必擔心連接字符串。

我去看看是否有這樣的功能和編輯我的答案,如果我找到一個。

+1

正確,則可列出目錄中的文件「第一」,但你正在做的「STAT」的呼叫,因爲他們在當前目錄 - STAT實際上是返回一個錯誤,「大小」你得到的只是隨機未初始化數據在st結構中。 – Soren

相關問題