2013-05-15 79 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中。 –

相关问题