Open()系统调用在此代码中不起作用。但是,如果不与目录指针组合使用,它们可以正常工作。这里我使用file->d_name访问字符串基址来打开文件,但它不起作用并打印错误。
#include<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<dirent.h>
#include<unistd.h>
#include<sys/dir.h>
int main()
{
DIR* d=opendir("DDD");
struct dirent* file;
int fd;
char WBUFFER[]="IO OS system callsn";
char RBUFFER[100001];
while((file=readdir(d))!=NULL)
if(strlen(file->d_name)>=10)
{
if((fd=open(file->d_name,O_RDWR,0))==-1)
printf("errorn");
read(fd,RBUFFER,101);
printf("%s",RBUFFER);
close(fd);
}
else if(strlen(file->d_name)>=3)
{
if((fd=open(file->d_name,O_RDWR,0))==-1)
printf("error2n");
write(fd,WBUFFER,50);
close(fd);
}
}
file->d_name
只包含文件名,不包含open(2)
要求的相对或绝对路径。这就是open()
失败的原因(除非您在当前目录中碰巧有与DDD
目录同名的文件)。
您需要使用snprintf()
将目录名前置到file->d_name
,如:
char buf[PATH_MAX];
snprintf(buf, sizeof buf, "DDD/%s", file->d_name);
并在open()
调用中使用buf
所以different ->d_name只包含文件名,不包含路径。如果您使用的是现代Linux或POSIX-2008兼容的系统,那么一种比较好的(比如,没有种族歧视)方法是这样的(缩短的半伪代码,将留下的细节填入其中,供读者练习):
int dfd = open("DDD", ...);
DIR *d = fdopendir(dfd);
...
while ((file = readdir(d)) != NULL) {
int fd = openat(dfd, file->d_name, ...);
...
}