GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verschieben einer Datei unter Linux in C

Wenn sich der ursprüngliche und der neue Speicherort für die Datei auf demselben Dateisystem befinden, ist ein „Verschieben“ konzeptionell identisch mit einem „Umbenennen“.

#include <stdio.h>

int rename (const char *oldname, const char *newname)

Der übliche Weg, eine Datei in C zu verschieben, ist die Verwendung von rename(2), was manchmal fehlschlägt.

Wenn Sie den Systemaufruf rename(2) nicht verwenden können (z. B. weil Quelle und Ziel auf unterschiedlichen Dateisystemen liegen), müssen Sie die Größe, Berechtigung und andere Metadaten der Quelldatei mit stat(2) abfragen; Kopieren Sie die Datenschleife auf read(2), write(2) (unter Verwendung eines Puffers von mehreren Kilobyte), open(2), close(2) und die Metadaten mit chmod(2), chown(2), utime(2) . Vielleicht interessieren Sie sich auch für das Kopieren von Attributen mit getxattr(2), setxattr(2), listxattr(2). Sie könnten in einigen Fällen auch sendfile(2) verwenden, wie von David C. Rankin kommentiert.

Und wenn sich Quelle und Ziel auf unterschiedlichen Dateisystemen befinden, gibt es keine Möglichkeit, die Bewegung atomar zu machen und Race-Conditions zu vermeiden (also ist die Verwendung von rename(2) nach Möglichkeit vorzuziehen, da es laut seiner Manpage atomar ist). Die Quelldatei kann während der Verschiebungsoperationen immer (durch einen anderen Prozess) modifiziert werden...

Ein praktischer Weg, Dateien zu verschieben, besteht also darin, zuerst zu versuchen, eine Umbenennung (2) durchzuführen, und wenn dies fehlschlägt, mit EXDEV (wenn oldpath und neuerPfad sich nicht auf demselben gemounteten Dateisystem befinden), müssen Sie Bytes und Metadaten kopieren. Mehrere Bibliotheken bieten dafür Funktionen an, z. Qt QFile::rename.

Lesen Sie Advanced Linux Programming - und siehe syscalls(2) - für mehr (und versuchen Sie auch, strace einige mv Befehl, um zu verstehen, was es tut). Dieses Buch kann kostenlos und legal heruntergeladen werden (so dass Sie mehrere Exemplare im Internet finden können).

Die /bin/mv Der Befehl (siehe mv(1)) ist Teil von GNU coreutils, einer freien Software. Sie könnten entweder den Quellcode studieren oder strace(1) verwenden, um zu verstehen, was dieser Befehl tut (in Bezug auf syscalls(2)). In einigen Open-Source-Unix-Shells wie sash oder busybox, mv könnte eine eingebaute Shell sein. Siehe auch path_resolution(7) und glob(7).

Es gibt subtile Eckfälle (stellen Sie sich einen anderen Prozess oder Pthread vor, der einige Dateioperationen auf demselben Dateisystem, Verzeichnis oder denselben Dateien ausführt). Lesen Sie ein Betriebssystem-Lehrbuch für mehr.

Die Verwendung einer Mischung aus snprintf(3), system(3), mv(1) könnte schwierig sein, wenn der Dateiname seltsame Zeichen wie tab enthält oder oder Zeilenumbrüche oder beginnt mit einem einleitenden - . Siehe errno(3).


Linux
  1. Benennen Sie eine Datei im Linux-Terminal um

  2. Verschieben von Dateien unter Linux ohne mv

  3. Linux – Alles ist eine Datei?

  4. Wie benenne ich eine Datei unter Linux um?

  5. Linux - Ersetzen von Leerzeichen in den Dateinamen

Gzip-Befehl unter Linux

Gunzip-Befehl unter Linux

Stat-Befehl unter Linux

So benennen Sie Verzeichnisse in Linux um

Was ist umask unter Linux?

So benennen Sie eine Datei (en) in Linux um