Как переместить определенный файл из одной папки в другую?
Что я пробовал,
#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
Пожалуйста, покажите мне, как я могу это сделать.
Вы действительно должны прочитать Расширенное программирование в 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), так далее…
Других решений пока нет …