Unix.lstat
est coûteux, on évite donc de répéter
plusieurs fois. Pour cela, on va maintenir pour chaque noeud une
structure qui regroupe le chemin et l'information sur le
noeud associé au chemin.
type info = { path : string; lstat : stats };; let info path = { path = path; lstat = lstat path };; |
mon_getcwd
, elle peut lever l'exception
Not_found
lorsqu'on ne réussit pas à trouver de chemin, ce qui peut se
produire si l'arborescence a été modifiée en cours de calcul (par un autre
programme s'exécutant en parallèle).
open Filename;; let mon_getcwd() = let rec find_root node = let parent_node = info (concat parent_dir_name node.path) in if equal_node node.lstat parent_node.lstat then "/" else let found name = name <> current_dir_name && name <> parent_dir_name && equal_node node.lstat (lstat (concat parent_node.path name)) in let name = dir_find found parent_node.path in concat (find_root parent_node) name in find_root (info current_dir_name);; |
current_dir_name
et parent_dir_name
car on sait à coup sûr qu'ils
ne peuvent pas convenir. On évite ainsi deux appels systèmes inutiles.