#c
#c
Вопрос:
В этом коде я пытаюсь скопировать файл file.txt
в каталог с именем folder
, но когда я запускаю код, он выдает следующую ошибку. Я искал в Интернете, но не нашел решения.
Ошибка
rsync: change_dir "/home/runner/TestC1/text" failed: Not a directory (20)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1196) [sender=3.1.2]
Код
char *transfer(char *f1, char *f2){
char cmd[500];
snprintf(cmd, 500, "rsync -a %s/ %s", f1, f2);
system(cmd);
return 0;
}
int main(){
transfer("/home/runner/TestC1/file.txt", "/home/runner/TestC1/folder");
return 0;
}
Комментарии:
1.Не забывайте о
PATH_MAX
вместо произвольных, вероятно, неправильных значений, таких как500
. Если вы принимаете два аргумента пути, вам понадобится как минимумPATH_MAX * 2
плюс все, что вам нужно для самой команды. Вам также необходимо учитывать тот факт, что аргументы командной строки нуждаются в экранировании, поскольку любые имена файлов с пробелами или неправильными символами в них приведут к сбою. Это также открывает вас для атак с использованием оболочки, что крайне плохо, если это общедоступный код.2.
rsync -a %s %s"
'/'
в конце вашего файла нет символа.'/'
В конце источника с rsync сообщает rsync скопировать содержимое каталога , а не сам каталог. Вы копируете один файл.'/'
Не принадлежит.3. Хорошая сделка. Но воспользуйтесь советом, который дал @tadman, и посмотрите
execv
, и т. Д. Иfork()
для порождения внешних процессов.system
довольно ограничено. (но для ваших целей здесь все в порядке)4. Это не имеет большого смысла.
rsync
просто скопируйте файл, сохраняя все время работы с файлом и разрешения, когда задана эта-a
опция. Это не удаление оригинала.5. Сначала вы можете (и должны) протестировать свои параметры rsync из командной строки. Когда rsync выполняет именно то, что вы хотите, вам просто нужно убедиться, что ваш код выдает ту же команду, что и та, которую вы уже тестировали. Если у вас проблема с самим rsync, это не вопрос программирования.