Программа для копирования файлов C не работает для каталога (в Linux) - PullRequest
0 голосов
/ 26 ноября 2018

Ниже приведена программа, которая копирует содержимое файла (1-й аргумент) в новый файл (2-й аргумент).

Я тестирую его на Linux, например, копирую содержимоеТерминал пользователя в новый файл также работает:

./copy /dev/tty newFile

Однако копирование содержимого текущего каталога не работает:

./copy . newFile

Последнее не вызывает ошибку при открытии 1-го аргумента, но ничего не копируется.Я думал, что содержимое каталога будет скопировано в новый файл?

РЕДАКТИРОВАТЬ: Это происходит потому, что linux по умолчанию принимает рабочий каталог как ~

.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);
    }
}

1 Ответ

0 голосов
/ 26 ноября 2018

Если вы прочитали 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 и вернули свой дескриптор файла, однако read не удастся при первом вызове.

...