2012-10-30 136 views
0

我需要用定義的源目錄中的文件的文件描述符填充緩衝區空間。所以,我有啓動代碼:C填充緩衝區

int main(int argc, char* argv[]) 
{ 
    DIR *src=opendir(argv[1]); 

    struct dirent *DirEntry; 
    char* buffer[200]; 
    do { 
     DirEntry = readdir(src); 
     if(DirEntry != NULL) { 
      //put file into buffer 
     } 
    }while(DirEntry!=NULL); 
} 

如何完成這個循環放置指定目錄下的所有文件描述成被稱爲「緩衝」的陣列?我應該使用像DirEntry->d_name這樣的DirEntry對象來返回一個文件描述符,然後將它放入數組中嗎?

+1

這與多線程或pthreads有什麼關係? – dreamlax

+1

另外一個文件描述符是一個整數,通常從'open()'或類似函數返回。 – dreamlax

+0

@dreamlax對不起,我想整個程序的這個特定部分不是,但該程序是一個多線程實現,將文件從源目錄移動到目標目錄 – Richard

回答

1

如果您需要將文件從源目錄移動到目標目錄,則需要的文件名遠遠多於需要文件描述符的文件名。使用這些名稱,您可以隨時打開和關閉描述符;如果沒有名稱,則無法合理地在目標目錄中創建文件。但是,我們也可以處理文件描述符。

因此,假設你有strdup(),您可以使用:

typedef struct File 
{ 
    char *name; 
    int fd; 
} File; 

而且在你的循環:

if (DirEntry != NULL) 
{ 
    buffer[i].name = strdup(DirEntry->d_name); 
    if (buffer[i].name != 0) 
     buffer[i].fd = open(buffer[i].name, O_RDONLY); 
    i++; 
} 

其中bufferFilei一個數組是一個方便的整數

enum { MAX_FILES = 4096 }; 
int i; 
File buffer[MAX_FILES]; 

您還應該添加ac ondition的主要條件,以確保沒有溢出(或動態分配一個替代固定大小的緩衝區):

if (DirEntry != NULL && i < MAX_FILES) 

你可以理智地打破循環,如果i達到極限。您可以測試名稱是否代表文件(與FIFO,塊設備,字符設備,套接字,符號鏈接,目錄等相對);你可能會使用stat()lstat()。如果調用open()失敗,文件描述符將爲負數(-1)。如果內存分配失敗,您可以通過不增加i來節省條目,但這可能不值得擔心。如果文件名的內存分配失敗,則不會有太多工作。

0

文件描述符是由open()系統調用返回的「int」類型值。它不在DirEntry結構中。因此,首先,您應該將緩衝區數組定義爲int類型,然後可以使用open()系統調用打開循環中的每個文件,並將open()返回的文件描述符保存到緩衝區數組中。

0

你的問題不太合理。如果你想要文件描述符,你必須打開文件或目錄與open()得到一個文件描述符。

如果你只是想在文件名存儲在一個數組,那麼你可以創建一個使用malloccalloc二維陣列和d_name成員複製到陣列中的下一個可用插槽。或者,您可以使用您擁有的功能並使用strdup等功能將字符串複製到陣列中,但要小心,因爲您需要稍後使用free()釋放該字符串。

如果您確實需要文件描述符,則需要創建一個int而不是char *的數組。

相關問題