1. Lecture des attributs de base : BasicFileAttributes
Lorsque nous parlons d’un fichier ou d’un dossier, nous ne parlons pas seulement de son nom ou de sa taille. Chaque fichier a un « passeport » — un ensemble d’attributs qui contient :
- Date de création
- Date de dernière modification
- Date du dernier accès
- Taille
- Permissions d’accès (qui peut lire, écrire, exécuter)
- Informations sur le propriétaire (sur Unix)
- Indicateurs « caché », « lecture seule » et autres
En Java, il existe un API pratique et puissant dans le package java.nio.file.attribute. Pas besoin d’écrire du code dépendant de la plateforme : tout le nécessaire se trouve dans la bibliothèque standard.
Pour commencer — importons les classes nécessaires :
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.io.IOException;
Comment obtenir les attributs de base d’un fichier ?
Utilisons la méthode Files.readAttributes :
Path path = Paths.get("example.txt");
try {
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("Créé : " + attrs.creationTime());
System.out.println("Modifié : " + attrs.lastModifiedTime());
System.out.println("Dernier accès : " + attrs.lastAccessTime());
System.out.println("Taille : " + attrs.size());
System.out.println("Est-ce un répertoire ? " + attrs.isDirectory());
System.out.println("Est-ce un fichier ? " + attrs.isRegularFile());
System.out.println("Est-ce un lien symbolique ? " + attrs.isSymbolicLink());
} catch (IOException e) {
System.out.println("Erreur lors de la lecture des attributs : " + e.getMessage());
}
Imaginez que vous êtes un inspecteur venu visiter un appartement. Vous ne vérifiez pas seulement s’il y a une porte (le fichier existe), mais vous demandez aussi aux occupants : « Quand l’immeuble a-t-il été construit ? Quand a eu lieu la dernière rénovation ? Qui est le propriétaire ? ».
En bref sur les propriétés de BasicFileAttributes
| Propriété | Que renvoie-t-elle ? |
|---|---|
|
Date et heure de création du fichier/dossier |
|
Date et heure de la dernière modification |
|
Date et heure du dernier accès |
|
Taille du fichier (en octets) |
|
Est-ce un répertoire ? |
|
Est-ce un fichier régulier ? |
|
Est-ce un lien symbolique ? |
2. Attributs avancés : POSIX et DOS
Attributs POSIX (Linux, macOS et autres systèmes de type Unix)
Si vous travaillez sur un système Unix, vous pouvez obtenir des informations supplémentaires : permissions d’accès, propriétaire, groupe.
try {
PosixFileAttributes posixAttrs = Files.readAttributes(path, PosixFileAttributes.class);
System.out.println("Propriétaire : " + posixAttrs.owner().getName());
System.out.println("Groupe : " + posixAttrs.group().getName());
System.out.println("Permissions : " + PosixFilePermissions.toString(posixAttrs.permissions()));
} catch (UnsupportedOperationException e) {
System.out.println("Les attributs POSIX ne sont pas pris en charge sur cet OS.");
} catch (IOException e) {
System.out.println("Erreur lors de la lecture des attributs POSIX : " + e.getMessage());
}
Remarque : Sous Windows, ce code lèvera UnsupportedOperationException — c’est normal.
Attributs DOS (Windows)
Sous Windows, vous pouvez manipuler les indicateurs « lecture seule », « caché », « archive », « système » :
try {
DosFileAttributes dosAttrs = Files.readAttributes(path, DosFileAttributes.class);
System.out.println("Caché : " + dosAttrs.isHidden());
System.out.println("Lecture seule : " + dosAttrs.isReadOnly());
System.out.println("Système : " + dosAttrs.isSystem());
System.out.println("Archive : " + dosAttrs.isArchive());
} catch (UnsupportedOperationException e) {
System.out.println("Les attributs DOS ne sont pas pris en charge sur cet OS.");
} catch (IOException e) {
System.out.println("Erreur lors de la lecture des attributs DOS : " + e.getMessage());
}
3. Modification des attributs de fichiers
Lire des passeports, c’est une chose ; changer une date de naissance ou un nom, c’en est une autre ! En Java, nous pouvons modifier les attributs des fichiers (bien entendu, avec les permissions nécessaires).
Modifier la date de dernière modification
import java.nio.file.attribute.FileTime;
Path file = Paths.get("example.txt");
try {
FileTime newTime = FileTime.fromMillis(System.currentTimeMillis() - 24 * 60 * 60 * 1000); // moins 1 jour
Files.setLastModifiedTime(file, newTime);
System.out.println("Horodatage de dernière modification modifié !");
} catch (IOException e) {
System.out.println("Erreur lors de la modification de l’heure : " + e.getMessage());
}
Modifier les permissions (POSIX)
Uniquement pour les systèmes Unix ! Par exemple, rendre le fichier exécutable pour tous :
try {
Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-xr-x");
Files.setPosixFilePermissions(file, perms);
System.out.println("Permissions mises à jour !");
} catch (UnsupportedOperationException e) {
System.out.println("Les permissions POSIX ne sont pas prises en charge sur cet OS.");
} catch (IOException e) {
System.out.println("Erreur lors de la modification des permissions : " + e.getMessage());
}
Explication de la chaîne "rwxr-xr-x" :
- r — read (lecture)
- w — write (écriture)
- x — execute (exécution)
- Le premier bloc de 3 caractères — propriétaire, le second — groupe, le troisième — autres.
Modifier l’état caché/lecture seule (attributs DOS, Windows)
Rendre le fichier caché :
try {
Files.setAttribute(file, "dos:hidden", true);
System.out.println("Le fichier est désormais caché (Windows) !");
} catch (UnsupportedOperationException e) {
System.out.println("Les attributs DOS ne sont pas pris en charge sur cet OS.");
} catch (IOException e) {
System.out.println("Erreur lors de la modification de l’attribut : " + e.getMessage());
}
Rendre le fichier « lecture seule » :
try {
Files.setAttribute(file, "dos:readonly", true);
System.out.println("Le fichier est désormais en lecture seule (Windows) !");
} catch (UnsupportedOperationException e) {
System.out.println("Les attributs DOS ne sont pas pris en charge sur cet OS.");
} catch (IOException e) {
System.out.println("Erreur lors de la modification de l’attribut : " + e.getMessage());
}
4. Vérification des droits d’accès
Il est parfois important de vérifier rapidement si un fichier est accessible en lecture, en écriture ou exécutable :
Path file = Paths.get("example.txt");
System.out.println("Lecture autorisée : " + Files.isReadable(file));
System.out.println("Écriture autorisée : " + Files.isWritable(file));
System.out.println("Exécution autorisée : " + Files.isExecutable(file));
Cela fonctionne de la même manière sur toutes les plateformes, même si le comportement réel dépend de l’OS et des paramètres de sécurité.
5. Pratique : affichage d’informations détaillées sur un fichier
Écrivons un mini-programme qui, à partir d’un chemin de fichier, affichera un maximum d’informations et essaiera de modifier certains attributs.
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.util.Set;
import java.io.IOException;
public class FileAttributesDemo {
public static void main(String[] args) throws IOException {
Path path = Paths.get("example.txt");
if (!Files.exists(path)) {
System.out.println("Fichier introuvable !");
return;
}
// Attributs de base
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("Nom : " + path.getFileName());
System.out.println("Chemin : " + path.toAbsolutePath());
System.out.println("Taille : " + attrs.size() + " octets");
System.out.println("Créé : " + attrs.creationTime());
System.out.println("Modifié : " + attrs.lastModifiedTime());
System.out.println("Dernier accès : " + attrs.lastAccessTime());
System.out.println("Est-ce un répertoire ? " + attrs.isDirectory());
System.out.println("Est-ce un fichier ? " + attrs.isRegularFile());
// Vérification des droits d’accès
System.out.println("Lecture autorisée : " + Files.isReadable(path));
System.out.println("Écriture autorisée : " + Files.isWritable(path));
System.out.println("Exécution autorisée : " + Files.isExecutable(path));
// Essayons de modifier l’horodatage de modification
FileTime now = FileTime.fromMillis(System.currentTimeMillis());
Files.setLastModifiedTime(path, now);
System.out.println("Horodatage de dernière modification mis à jour !");
// Essayons de rendre le fichier caché (si pris en charge)
try {
Files.setAttribute(path, "dos:hidden", true);
System.out.println("Le fichier est devenu caché (si l’OS le prend en charge).");
} catch (UnsupportedOperationException e) {
System.out.println("Les fichiers cachés ne sont pas pris en charge sur cet OS.");
}
// Essayons d’afficher les permissions POSIX (si pris en charge)
try {
PosixFileAttributes posixAttrs = Files.readAttributes(path, PosixFileAttributes.class);
System.out.println("Propriétaire : " + posixAttrs.owner().getName());
System.out.println("Permissions : " + PosixFilePermissions.toString(posixAttrs.permissions()));
} catch (UnsupportedOperationException e) {
System.out.println("Les attributs POSIX ne sont pas pris en charge sur cet OS.");
}
}
}
6. Subtilités utiles
Différences multiplateformes et conseils
- Tous les attributs ne sont pas disponibles sur tous les OS ! Sous Windows, il n’y a pas de permissions POSIX, et sous Linux il n’y a pas d’attributs DOS.
- Utilisez toujours try-catch ! Les méthodes peuvent lever UnsupportedOperationException ou IOException.
- Les droits d’accès ne se limitent pas toujours à « rwx » ! Sous Windows, le modèle de droits est différent ; « lecture seule » peut être imposé par la politique de sécurité de l’OS.
- Les fichiers cachés sont une notion relative. Sous Unix, un fichier est caché si son nom commence par un point (.hidden) ; sous Windows, s’il possède l’attribut dos:hidden.
Tableau : disponibilité des attributs selon la plateforme
| Attribut | Windows (dos:*) | Linux/macOS (posix:*) |
|---|---|---|
| Date de création | + | + |
| Date de dernière modification | + | + |
| Date du dernier accès | + | + |
| Fichier caché | + | Uniquement nom commençant par un point |
| Lecture seule | + | + |
| Permissions (rwx) | - | + |
| Propriétaire, groupe | - | + |
| Archive, système | + | - |
7. Erreurs typiques lors de la manipulation des attributs de fichiers
Erreur n° 1 : tentative de lire ou de modifier des attributs POSIX sous Windows. Sous Windows, vous obtiendrez UnsupportedOperationException. Gérez toujours cette exception si vous écrivez du code multiplateforme.
Erreur n° 2 : modifier l’horodatage de modification d’un fichier déjà ouvert par un autre processus. Sur certains systèmes, le fichier peut être verrouillé et l’opération échouera.
Erreur n° 3 : s’attendre à ce que l’opération « cacher le fichier » fonctionne de la même façon sur tous les OS. Sous Unix, un fichier est caché si son nom commence par un point (.gitignore), tandis que sous Windows il l’est si l’attribut dos:hidden est défini. Ne confondez pas ces approches.
Erreur n° 4 : négliger la vérification de l’existence du fichier avant l’opération. S’il n’existe pas, vous obtiendrez NoSuchFileException en tentant de lire ou de modifier ses attributs.
Erreur n° 5 : absence de vérification des droits d’accès. Si l’utilisateur n’a pas les droits pour modifier les attributs, l’opération échouera. Avant de modifier, vérifiez Files.isWritable(path).
GO TO FULL VERSION