【问题标题】:open a windows file directory for reading/writing in c在c中打开一个用于读/写的windows文件目录
【发布时间】:2025-12-24 14:40:12
【问题描述】:

我正在尝试使用 c 将 windows 目录的内容写入文件。例如,如果我有一个 jpeg 目录(即包含多个 jpeg 的目录)并且想将它们转换为 .raw 文件,我有这样的东西:

#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 终止。有人对如何解决这个问题有任何想法吗?

【问题讨论】:

  • 什么是"windows 文件目录"jpegs 是什么,是文件还是目录? “或者更一般地说,Windows 如何在内存中对其目录和/或硬盘驱动器进行分区?” - 我现在摸不着头脑......你的直接问题是:你真的知道什么吗?术语 memorypartition 究竟是什么意思?我问是因为他们与您的问题无关。
  • 这是一个目录。对不起,令人困惑的语言。哎呀,写得很快,没有考虑我想问什么。我想我想问的是 Windows 目录在内存中是如何相互区分的。或者换一种说法,当我在目录上使用 fopen 时, fread 究竟是从什么读取的?
  • 因为,当我运行这个脚本时,它只是继续运行并不断向 new.raw 写入比 jpegs 目录中更多的字节。
  • 拜托,仔细改写你的问题,仍然不清楚"file of jpegs"是什么?那么它是一个文件,还是一个目录?
  • 您似乎实际上有两个问题:首先读取目录并获取给定类型的所有文件,其次显然(?)希望将 .jpeg 文件转换为某些文件原始位图格式,并且(可能?)将它们全部连接成一个。或者,也许您正在重新发明一个原始的 tarcpio 样式存档器,它只是连接文件而不修改它们?

标签: c windows memory


【解决方案1】:

在 Unix 系统上,尽管您可以打开一个目录进行读取,但除非您使用 opendir()readdir()closedir() 系列调用,否则您无法真正从中读取。您不能写入 Unix 上的目录;即使是超级用户(root)也不能这样做。 (打开目录的主要原因,通常使用open() 而不是fopen(),以便您可以使用chdir() 后跟fchdir() 回到您开始的位置,或者使用各种*at() 功能,如openat(),引用目录。)

在 Windows 上,您至少需要使用"rb" 模式,但坦率地说,我不希望您能用它做很多事情。 Windows API 中可能有与 Unix opendir() 函数类似的函数,您应该使用这些函数。

【讨论】:

  • Windows API 确实有 opendir() / readdir() / closedir() 因为它们是 POSIX 合规性所必需的……这是 windows 迫切想做的事情
  • @AhmedMasud:感谢您提供的信息。我不确定这些是主流 Windows API 的一部分还是“POSIX ghetto”的一部分,其中 POSIX 函数使用下划线前缀重命名,否则它们会侵入用户的命名空间。
  • 曾几何时,在一个名为“Unix 文件系统”的过时文件系统类型中,文件名限制为 14 个字符,inode 编号限制为 2 个字节,可以打开使用普通的open()read()close() 读取目录并读取名称(和 inode 编号,尽管您无能为力)。 IIRC,您可以在 K&R(“C 编程语言”)或 K&P(“UNIX 编程环境”)中找到类似的代码。在第 7 版 UNIX 时代,没有 opendir() 等接口。这出现在 BSD 快速文件系统中。
最近更新 更多