Как переместить файл из одной папки в другую папку в Linux

Как переместить определенный файл из одной папки в другую?

Что я пробовал,

#include <stdio.h>

int main() {
FILE *tFile;
if (tFile != NULL)
tFile = NULL;
if ((tFile = fopen("TempFile.txt", "rw")) == NULL) {
return -1;
}

mv("TempFile.txt", "../MST");

printf("Done Succesfully\n");
return 0;
}

Ошибка :

test.c:17:2: warning: no newline at end of file
/tmp/ccKLWYNa.o(.text+0x5e): In function `main':
: undefined reference to `mv'
collect2: ld returned 1 exit status

Пожалуйста, покажите мне, как я могу это сделать.

2

Решение

Вы действительно должны прочитать Расширенное программирование в Linux.

Переместить (из C) файл из одного места в другое в той же файловой системе просто используйте переименование (2) Системный вызов.

По крайней мере, для вашего конкретного примера вам нужно написать код:

char* srcpath = "TempFile.txt"; // assume it is a variable path
char destpath[1024];
snprintf (destpath, sizeof(destpath), "../MST/%s", srcpath);
if (rename (srcpath, destpath)) {
// something went wrong
if (errno == EXDEV) {
// copy data and meta data
} else { perror("rename"); exit(EXIT_FAILURE); };
}
else { // the rename succeeded
}

Если вы действительно хотите mv TempFile.txt ../MST/TempFile.txt специально для TempFile.txt только ты мог просто позвонить rename("TempFile.txt", "../MST/TempFile.txt") и обрабатывать случаи ошибок, как я предлагаю. Если вы уверены, что ../MST/лежат в той же файловой системе, чем . затем EXDEV не должно происходить, и вам не нужно обрабатывать это особенно (но вам нужно обрабатывать ошибки).

Если вы хотите переместить файл между двумя различными файловыми системами, вы должны скопировать данные (и, возможно, некоторые из метаданных) самостоятельно (а затем удалить, например, с помощью разъединить (2)) исходный файл). Вы можете обнаружить эту ситуацию различными способами: вы можете просто попробовать rename и если errno (увидеть ERRNO (3)) является EXDEV вам нужно скопировать файл. Или вы могли бы использовать стат (2) запросить исходный файл (и место назначения каталог) метаданные, например его размер и его файловая система.

Конечно, вам нужно понять, что такое файлы в Linux (или Posix), в частности, что такое инода….

Вы могли бы использовать system с /bin/mv (но будьте осторожны со странными символами — такими как пробелы или точки с запятой — в путях к файлам, вы должны избегать их, чтобы избежать внедрение кода), видимо, вы не хотите.

Вы должны играть с Трассирование (1) (или, возможно, также ltrace) на mv в различных ситуациях, чтобы понять, что он делает. Также изучите исходный код GNU coreutils который обеспечивает /bin/mv особенно в mv.c

Некоторые дополнительные библиотеки C или C ++ могут предоставлять вам функции для перемещения файлов (в той же файловой системе они должны делать renameв разных файловых системах они копируют данные исходного файла и, возможно, некоторые метаданные и разъединяют источник, поэтому не могут быть атомарными), например в С g_file_move (от Gio с Glib из Gnome) или в C ++ копировать файл -с последующим remove в Boost и т.д и т.д ….

PS. Для временных файлов см. tmpfile (3), mkstemp (3), так далее…

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]