Как программно переместить символическую ссылку Linux в другую файловую систему (копию) в C? - PullRequest
0 голосов
/ 08 мая 2019

Функция rename () C не работает в файловых системах. Таким образом, я могу перемещать файлы через копию, открывая их, читая их и записывая в новую копию, а затем отменяя связь. Но мне трудно заставить это работать с символическими ссылками. (Идея состоит в том, чтобы переместить папку с кучей других файлов / папок / символических ссылок и т.д. внутри нее). В основном реализация команды mv в C.

open(file, O_RDONLY)
while ((c = read(source_descriptor, buf, SIZE)) > 0){
        write(d, buf, c);
}
unlink file;

Работает хорошо для обычных файлов (и у меня есть другая функция, обрабатывающая каталоги без проблем). Но всякий раз, когда он попадает по символической ссылке, я получаю perror выплевывая Нет такого файла или каталога .

Я могу определить, является ли это символической ссылкой через d_type , но я не уверен, как читать / копировать его, когда он у меня есть, так как обычное копирование файла не работает с символическими ссылками, потому что open () отказывается открывать им.

Ответы [ 2 ]

5 голосов
/ 08 мая 2019

Как только вы определили, что имеете дело с символической ссылкой (что можно сделать, например, с помощью lstat()), вы можете прочитать ее содержимое с помощью readlink() и воссоздайте его в целевом месте, позвонив по номеру symlink().

См. Также man 7 symlink.

0 голосов
/ 08 мая 2019

Когда вы open символьная ссылка без флага O_NOFOLLOW, она будет разыменовывать символическую ссылку (или цепочку символических ссылок, если это символическая ссылка на символическую ссылку).Если пункт назначения не существует, открыть не удастся.Флаг O_NOFOLLOW гарантирует, что если вы попытаетесь открыть символическую ссылку, вы действительно получите ошибку.

Чтобы «скопировать» символическую ссылку, вам придется прочитать ее с помощью readlink и создатьновая символическая ссылка в пункте назначения.Однако вам, возможно, придется скорректировать путь, на который он указывает.

Однако , если вашей программе необходимо скопировать деревья каталогов в системе * nix, правильный способ реализовать этоне для того, чтобы заново изобретать колесо, а для того, чтобы следовать пути Unix и просто выполнить программу cp с правильными аргументами.

...