gpt4 book ai didi

c - 为什么不使用fread读取目录文件?

转载 作者:行者123 更新时间:2023-12-02 08:32:51 26 4
gpt4 key购买 nike

我正在阅读莫里斯·巴赫(Maurice Bach)的Unix Book中的一个示例。他编写了一个简单的复制程序,如下所述。但是,当输入文件为目录文件时,它将失败。我确实偶然发现了opendir和其他一些此类API-我应该使用它吗?

如果二进制文件可以解决此问题,为什么目录文件被认为与众不同?在Unix中,并非所有内容都抽象为文件,无论程序解释它的方式如何。

另外,如何扩展该程序以支持目录文件,然后创建该文件的mknod?我想测试一下,假设我在/home/user1中,并对其进行$./copy /home/user user-home-clonemknod来查看该目录与home有何不同。我猜user-home-clone可能没有对其自身的引用,但是/home/user中的所有其他文件[即使它会在/ home / user中存在一个名为user-home-clone的文件],因为当我们这样做时它并不存在复制命令?

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

char buffer[2048];

int copy(FILE *source, FILE *destination)
{
int count;
while ((count = fread(buffer, 1, sizeof buffer , source)) > 0)
{
fwrite(buffer, 1, count, destination);
}
return 0;
}

int main(int argc, char* argv[])
{
int status;
FILE *source;
FILE *destination;

if (argc != 3)
{
printf("%s takes exactly 3 arguments\n", argv[0]);
exit(1);
}
source = fopen(argv[1], "r");
if (source == NULL)
{
printf("%s can't be opened for reading\n", argv[1]);
exit(1);
}
destination = fopen(argv[2], "wb");
if (destination == NULL)
{
printf("%s can't be opened for writing\n", argv[2]);
exit(1);
}
if (copy(source, destination) == 0)
{
status = 0;
}
else
{
status = 1;
}

fclose(source);
fclose(destination);
exit(status);
}

我使用Centos 6.5 Linux Ext4文件系统

最佳答案

在Unix的早期版本中,目录文件可以读取为二进制文件。但是,当添加网络和其他类型的虚拟文件系统时,此功能被删除,因为不同的文件系统实现目录的方式有所不同。尽管从技术上讲,驱动程序可以为这些目录模拟字节流结构,但这并不是一个有用的功能。目录应被视为不透明的抽象集合,并使用特定于目录的功能进行访问。

关于c - 为什么不使用fread读取目录文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24981566/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com