C 文件复制程序不适用于目录(linux)
C file copying program does not work for directory (on linux)
以下是将文件内容(第一个参数)复制到新文件(第二个参数)的程序。
我正在 linux 上对其进行测试,因此,例如,将用户终端的内容复制到新文件中也可以:
./copy /dev/tty newFile
但是,复制当前目录的内容不起作用:
./copy . newFile
后者在打开第一个参数时不会导致错误,但不会复制任何内容。我以为目录的内容会被复制到新文件中?
编辑:发生这种情况是因为 linux 按照标准将工作目录设为 ~
copy.c 下面的程序:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int copy(int inFileDesc,int outFileDesc);
int main (int argc, char** argv)
{
int inputfd;
int outputfd;
if (argc!=3)
{
printf("Wrong number of arguments\n");
exit(1);
}
inputfd=open(argv[1],O_RDONLY);
if(inputfd==-1)
{
printf("Cannot open file\n");
exit(1);
}
outputfd=creat(argv[2],0666);
if(outputfd==-1)
{
printf("Cannot create file\n");
exit(1);
}
copy(inputfd,outputfd);
exit(0);
}
int copy(int inFileDesc,int outFileDesc)
{
int count;
char buffer[BUFSIZ];
while((count=read(inFileDesc,buffer,sizeof(buffer)))>0)
{
write(outFileDesc,buffer,count);
}
}
如果您阅读 man 2 open
一个 man 2 read
人2开
The named file is opened unless:
...
[EISDIR] The named file is a directory, and the arguments specify that it is to
be opened for writing.
人 2 读
The pread(), read(), and readv() calls will succeed unless:
...
[EISDIR] An attempt is made to read a directory.
因此,open
不会失败,因为您指定了 O_RDONLY
和 return 文件描述符,但是 read
会在第一次调用时失败。
以下是将文件内容(第一个参数)复制到新文件(第二个参数)的程序。
我正在 linux 上对其进行测试,因此,例如,将用户终端的内容复制到新文件中也可以:
./copy /dev/tty newFile
但是,复制当前目录的内容不起作用:
./copy . newFile
后者在打开第一个参数时不会导致错误,但不会复制任何内容。我以为目录的内容会被复制到新文件中?
编辑:发生这种情况是因为 linux 按照标准将工作目录设为 ~
copy.c 下面的程序:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int copy(int inFileDesc,int outFileDesc);
int main (int argc, char** argv)
{
int inputfd;
int outputfd;
if (argc!=3)
{
printf("Wrong number of arguments\n");
exit(1);
}
inputfd=open(argv[1],O_RDONLY);
if(inputfd==-1)
{
printf("Cannot open file\n");
exit(1);
}
outputfd=creat(argv[2],0666);
if(outputfd==-1)
{
printf("Cannot create file\n");
exit(1);
}
copy(inputfd,outputfd);
exit(0);
}
int copy(int inFileDesc,int outFileDesc)
{
int count;
char buffer[BUFSIZ];
while((count=read(inFileDesc,buffer,sizeof(buffer)))>0)
{
write(outFileDesc,buffer,count);
}
}
如果您阅读 man 2 open
一个 man 2 read
人2开
The named file is opened unless:
...
[EISDIR] The named file is a directory, and the arguments specify that it is to
be opened for writing.
人 2 读
The pread(), read(), and readv() calls will succeed unless:
...
[EISDIR] An attempt is made to read a directory.
因此,open
不会失败,因为您指定了 O_RDONLY
和 return 文件描述符,但是 read
会在第一次调用时失败。