2013-05-15 81 views
0

我試圖用c將一個windows目錄的內容寫入文件。舉例來說,如果我有JPEG文件的目錄(即包含多個JPEG文件的目錄),並希望將其轉換爲一個.raw文件,我有這樣的事情:打開一個Windows文件目錄在c中讀取/寫入

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

typedef uint8_t BYTE; 

#define BLOCK 512*sizeof(BYTE); 

int main(void) 
{ 
    FILE * fd = fopen("C:\\jpegs", "r"); 
    if (fd == NULL) { 
     fprintf(stderr, "Error opening device file.\n"); 
     return EXIT_FAILURE; 
    } 
    int block = BLOCK; 
    FILE * fn = fopen("new.raw", "w+"); 
    void * buff = malloc(block); 
    while(feof(fd) == 0) { 
     fread(buff,block,1,fd); 
     fwrite(buff,block,1,fn); 
    } 
    free(buff); 
    fclose(fd); 
    fclose(fn); 
    return 0; 
} 

的問題是我不知道認爲Windows目錄以EOF終止。有沒有人有關於如何解決這個問題的任何想法?

+0

什麼是_「windows文件目錄」_?什麼是'jpegs',它是一個文件,還是一個目錄? _「或者更一般地說,Windows如何在內存中分割其目錄和/或硬盤驅動器?」_ - 我現在正在撓頭......對你而言,直接的問題是:你真的知道_memory_和_partition_實際上是什麼詞意思?我在問,因爲他們與你的問題無關。 –

+0

這是一個目錄。對於令人困惑的語言感到抱歉。哎呀,快速寫下來,沒有想到我想問什麼。我想我想問的是,Windows目錄是如何在內存中彼此區分的。或者換句話說,當我在目錄上使用fopen時,fread讀取的內容究竟是什麼? – mrizzo

+0

因爲,當我運行這個腳本時,它只是繼續運行並且不斷向new.raw寫入比在jpegs目錄中更多的字節。 – mrizzo

回答

1

在Unix系統上,儘管您可以打開一個目錄進行閱讀,但除非您使用opendir(),,closedir()調用系列,否則您無法真正閱讀它。您不能在Unix上寫入目錄;即使超級用戶(root)也無法做到這一點。 (打開一個目錄的主要原因,通常是open()fopen(),這樣你就可以使用chdir()然後fchdir()返回到你開始的位置,或者使用諸如openat()之類的各種*at()函數來引用該目錄。 )

在Windows上,您至少需要使用"rb"模式,但坦率地說,我不希望您能夠用它做很多事情。有可能類似於Windows API中的Unix opendir()函數,您應該使用它們。

+1

Windows API確實有opendir()/ readdir()/ closedir(),因爲它們是符合POSIX要求的......窗戶絕望地想要做 –

+0

@AhmedMasud:謝謝你提供的信息。我不確定這些是否是主流Windows API的一部分,或者POSIX函數被下劃線前綴重命名的'POSIX貧民窟'的一部分,否則它們會侵入用戶的名稱空間。 –

+1

曾幾何時,在名爲「Unix文件系統」的文件系統中,文件名有14個字符,inode編號有2個字節,可以打開目錄並讀取名稱(和inode數字,儘管你可以用它們做的事情不多),使用普通的'open()','read()','close()'。 IIRC,您可以在K&R('The C Programming Language')或K&P('UNIX Programming Environment')中找到類似的代碼。在第七版UNIX的時代,沒有'opendir()'等接口。這出現在BSD Fast File System中。 –

相關問題