Я хочу сделать функцию копирования файла в UNIX - PullRequest
1 голос
/ 28 апреля 2019

при вводе «./test test.c / home / user1 / Desktop /» ничего не работает.

Я хочу скопировать файл из (now_path) в (other_path).

Но я не знаю, почему это не работает, я думаю, что это идеальный код.Это ошибка или нужны другие коды?

char ch;
int src, dst;

if( argc != 3 )                                               
{
    printf("argument error\n");
    printf("usage: ./a.out src dest\n");
}
src = open( argv[1], O_RDONLY );                                         
dst = open( argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644 );           

while( read( src, &ch, 1 ))
    write( dst, &ch, 1 );

close( src );
close( dst );
return 0;

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Невозможно понять, если вы не начнете проверять возвращаемые значения.Функция open возвращает отрицательное значение при ошибке, а errno указывает, что пошло не так.

То же самое относится к read и write.Они возвращают количество прочитанных / записанных байтов и отрицательное значение при сбое.errno также устанавливается этими функциями.

Вы можете использовать конструкции, подобные этой:

if ((src = open( argv[1], O_RDONLY )) < 0) {
    fprintf(stderr, "Error accessing source file.\n");
    fprintf(stderr, "errno: %s\n", strerror(errno));
    exit(EXIT_FAILURE);
}
0 голосов
/ 28 апреля 2019

Ваш код в порядке, но вы можете убедиться, что исходный файл доступен для чтения, прежде чем пытаться скопировать его содержимое. Также вы можете прекратить выполнение программы в случае ошибки.

char ch;
int src, dst;

if( argc != 3 )                                               
{
    printf("argument error\n");
    printf("usage: ./a.out src dest\n");
    exit(1); // Terminate the program
}

if ((src = open( argv[1], O_RDONLY )) == -1)
{
    printf("Error accessing source file.\n");
    exit(1);
}                             

if (dst = open( argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644 )) == -1)
{
    printf("Error accessing destination file.\n");
    exit(1);
}           

while( read( src, &ch, 1 ) > 0 )
    write( dst, &ch, 1 );

close( src );
close( dst );

return 0;

Кроме того, если вторым аргументом всегда будет каталог, вам нужно установить для команды open для файла назначения комбинацию второго и первого аргументов (argv[2], объединенный с argv[1]).

Для этого вы можете использовать функцию strcat, которая копирует содержимое второй строки в первую. Начните с добавления #include <string.h> в заголовок вашей программы:

char* buffer[BUF_SIZE];
int src, dst;
int bytesRead;
char dstFile[1024];

if (argc != 3)
{
    printf("argument error\n");
    printf("usage: ./a.out src dest\n");
}

if ((src = open(argv[1], O_RDONLY)) == -1)
{
    printf("Error accessing source file.\n");
    exit(1);
}

strcat(dstFile, argv[2]);
strcat(dstFile, argv[1]);

if ((dst = open(dstFile, O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1)
{
    printf("Error accessing destination file. %s\n", dstFile);
    exit(1);
}

while ((bytesRead = read(src, buffer, BUF_SIZE)) > 0)
{
    write(dst, buffer, bytesRead);
}

close(src);
close(dst);

return 0;
...