st_dev
, st_ino
) d’un fichier source fait
correspondre le nom de son fichier destination. À chaque copie, on
consulte cette table pour voir si un fichier source avec le même
couple (st_dev
, st_ino
) a déjà été copié; si oui, on fait un
lien dur vers le fichier destination, au lieu de refaire la copie.
Pour diminuer la taille de cette table, on peut n’y mettre que des
fichiers qui ont plusieurs noms, c’est-à-dire tels que
st_nlink
> 1. let copied_files = (Hashtbl.create 53 : ((int * int), string) Hashtbl.t) let rec copy source dest = let infos = lstat source in match infos.st_kind with S_REG -> if infos.st_nlink > 1 then begin try let dest' = Hashtbl.find copied_files (infos.st_dev, infos.st_ino) in link dest' dest with Not_found -> Hashtbl.add copied_files (infos.st_dev, infos.st_ino) dest; file_copy source dest; set_infos dest infos end else begin file_copy source dest; set_infos dest infos end |
| S_LNK -> ... |