GNU/Linux >> Znalost Linux >  >> Linux

Přesunutí souboru v Linuxu v C

Pokud jsou původní a nové umístění souboru na stejném souborovém systému, pak je „přesun“ koncepčně identický s „přejmenováním.“

#include <stdio.h>

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

Obvyklý způsob, jak přesunout soubor v C, je použít rename(2), které někdy selže.

Pokud nemůžete použít syscall rename(2) (např. protože zdroj a cíl jsou na různých souborových systémech), musíte se zeptat na velikost, oprávnění a další metadata zdrojového souboru pomocí stat(2); zkopírujte zacyklení dat na read(2), write(2) (pomocí vyrovnávací paměti o velikosti několika kilobajtů), open(2), close(2) a metadata pomocí chmod(2), chown(2), utime(2) . Můžete se také starat o kopírování atributů pomocí getxattr(2), setxattr(2), listxattr(2). V některých případech můžete také použít sendfile(2), jak uvedl David C. Rankin.

A pokud jsou zdroj a cíl na různých souborových systémech, neexistuje způsob, jak přesunout atomický a vyhnout se rasovým podmínkám (takže použití rename(2) je vhodnější, pokud je to možné, protože je atomický podle jeho manuálové stránky). Zdrojový soubor lze vždy upravit (jiným procesem) během operací přesunu...

Takže praktický způsob, jak přesunout soubory, je nejprve zkusit přejmenovat(2), a pokud to selže, pomocí EXDEV (když stará cesta a nová cesta nejsou na stejném připojeném souborovém systému), pak musíte zkopírovat bajty a metadata. Několik knihoven poskytuje funkce, které to dělají, např. Qt QFile::rename.

Přečtěte si Pokročilé programování Linuxu – a podívejte se na syscalls(2) – pro více (a také zkuste strace nějaké mv příkaz k pochopení toho, co dělá). Tato kniha je volně a legálně ke stažení (takže na webu můžete najít několik kopií).

/bin/mv příkaz (viz mv(1)) je součástí GNU coreutils, což je svobodný software. Můžete buď studovat jeho zdrojový kód, nebo použít strace(1), abyste pochopili, co tento příkaz dělá (z hlediska syscalls(2)). V některých unixových shellech s otevřeným zdrojovým kódem, jako je sashe nebo busybox, mv může být vestavěný shell. Viz také path_resolution(7) a glob(7).

Existují jemné rohové případy (představte si, že jiný proces nebo pthread provádí nějaké operace se soubory na stejném souborovém systému, adresáři nebo souborech). Více si přečtěte v učebnici operačního systému.

Použití kombinace snprintf(3), system(3), mv(1) může být složité, pokud název souboru obsahuje podivné znaky, jako je tab nebo nebo nové řádky nebo začíná počátečním - . Viz errno(3).


Linux
  1. Přejmenujte soubor v terminálu Linux

  2. Linux – všechno je soubor?

  3. Jak přejmenovat soubor v Linuxu?

  1. Jak přesunout soubor v Linuxu

  2. Přesouvání souborů na Linuxu bez mv

  3. Linux - Nahrazení mezer v názvech souborů

  1. Vysvětlení oprávnění souborů v systému Linux

  2. Linux Tail Command

  3. Linux Touch Command