2017-05-01 5 views
1

Bonjour à tous, J'essaie de trouver un moyen en Java pour comprendre le chemin du fichier vers lequel pointe un lien symbolique. Nous avons un système qui surveille un dossier de lien symbolique, fait des choses basées sur le nom de fichier, supprime ce fichier de lien symbolique. Ce que je dois faire est de comprendre où chaque fichier de lien symbolique pointe vers ainsi je peux également supprimer ce fichier quand le lien symbolique. Ceci utilise Java Ceci est sur un système RHEL.JAVA comment trouver le chemin du fichier cible vers lequel pointe un lien symbolique?

Toute aide à propos de l'API serait grandement appréciée. Je frappe un mur sur mes recherches.

Répondre

3

https://docs.oracle.com/javase/8/docs/api/java/nio/file/Path.html#toRealPath-java.nio.file.LinkOption...-

Chemin toRealPath (... LinkOption options) throws IOException Renvoie le chemin réel d'un fichier existant. La définition précise de cette méthode est dépendante de l'implémentation mais en général elle dérive de ce chemin, un chemin absolu qui localise le même fichier que ce chemin, mais avec des éléments de nom qui représentent le nom réel des répertoires et du fichier . Par exemple, lorsque les comparaisons de nom de fichier sur un système de fichiers sont insensibles à la casse, les éléments de nom représentent les noms dans leur cas réel. En outre, le chemin résultant a des éléments de nom redondants supprimés.

Si ce chemin est relatif, alors son chemin absolu est d'abord obtenu, comme si en invoquant la méthode toAbsolutePath.

Le tableau d'options peut être utilisé pour indiquer comment les liens symboliques sont traités. Par défaut, les liens symboliques sont résolus à leur cible finale . Si l'option NOFOLLOW_LINKS est présente, alors cette méthode ne résout pas les liens symboliques . Certaines implémentations autorisent des noms spéciaux tels que ".." pour faire référence au répertoire parent. Lors de la dérivation du vrai chemin , et un ".." (ou équivalent) est précédé d'un nom non ".." alors une implémentation entraînera généralement la suppression des deux noms. Lorsque ne résout pas les liens symboliques et que le nom précédent est un lien symbolique , les noms ne sont supprimés que s'ils garantissent que le chemin obtenu localisera le même fichier que ce chemin.

Paramètres: Options - indiquant la façon dont les liens symboliques sont traités Retourne un chemin absolu représentent le chemin réel du fichier situé par cet objet Jetés: IOException - si le fichier ne existe ou une erreur d'E/S securityException - Dans le cas du fournisseur par défaut , et qu'un gestionnaire de sécurité est installé, sa méthode checkRead est invoquée pour vérifier l'accès en lecture au fichier, et où ce chemin n'est pas absolu, sa méthode checkPropertyAccess est invoquée pour accès à la propriété système user.dir

Utilisez la méthode toRealPath() de nio. Le NO_FOLLOW_LINKS LinkOption fait le contraire de ce que vous essayez de faire, alors ne l'utilisez pas.

Path realPath = aFile.toPath().toRealPath() 

Path realPath = aPath().toRealPath() 

Un Gotcha avec cela, est que, contrairement à toAbsolutePath, toRealPath jette un IOException car il a fait d'interagir avec le système de fichiers pour trouver le vrai chemin.

+0

De grands détails et un lien vers l'API, note supplémentaire que l'exception SecurityException peut également être levée. C'était exactement l'information dont j'avais besoin. Merci pour votre aide @Novaterata – Elijah

+0

Droit, mais IOException est vérifiée donc vous devrez soit modifier votre interface ou utiliser un try/catch – Novaterata

2

java.nio.file.Files.readSymbolicLink peut être ce dont vous avez besoin.

+0

Merci pour le chemin d'importation. – Elijah

+0

prenez garde qu'il renverra un chemin relatif, dites '/ usr/local/link ->./File' pour'/usr/local/file'. Ensuite, Files.readSymbolicLink renvoie 'file' et' Paths.get ("/ usr/local/files"). Equals (Files.readSymbolicLink (Paths.get ("/ usr/local/link"))) 'est faux. Dans ce cas, j'ai utilisé 'Files.isSameFile (fichier, lien)'. Et pour obtenir le chemin absolu du fichier cible d'un lien, 'link.toRealPath()' – juanmf