Java – Comment détecter la suppression de fichier lors de l’écriture dans un fichier?

Notre programme java écrit en continu des données importantes dans un fichier. Nous voulons maintenant lancer une exception ou afficher un message d’erreur sur la console chaque fois que le fichier (dans lequel le programme Java est écrit) est supprimé manuellement par un utilisateur.

J’ai trouvé que Java ne lève aucune exception lorsqu’il essaie d’écrire dans un fichier qui a été supprimé.

Méthode I – Démarrer un nouveau thread qui vérifie si le fichier est présent et en informe le programme Java principal lorsque le fichier a été supprimé. Cela ne fonctionnera pas dans notre cas car nous aurons plusieurs fichiers sur lesquels le programme java écrira. Par conséquent, le démarrage d’un nouveau thread pour chaque fichier ne sera pas efficace en mémoire.

Méthode II – Vérifier l’existence du fichier à chaque fois juste avant d’écrire dans le fichier. Ce n’est pas non plus une bonne approche car vérifier l’existence du fichier est une opération plus coûteuse.

Méthode III – Étendez la méthode java.io.FilterWriter (que nous utilisons pour écrire dans un fichier) et surchargez la méthode write () pour renvoyer une exception chaque fois qu’elle tente d’écrire dans un fichier supprimé. Cela semble être une bonne solution, mais je n’ai trouvé aucun endroit où Java digère une exception (lorsqu’elle tente d’écrire dans un fichier qui a été supprimé), ce que nous pouvons créer en surchargeant cette méthode.

Les classes FileChannel et FileLock pourraient être utiles dans ce cas.

voir Comment puis-je verrouiller un fichier en utilisant Java (si possible)

Sous Unix, il y a des fichiers et des répertoires. Un fichier peut apparaître dans autant de répertoires que vous le souhaitez et un fichier ouvert peut se trouver sur le disque sans apparaître dans aucun répertoire. Si un fichier est supprimé d’un répertoire qui constitue une modification, ce n’est pas le fichier.

Pour déterminer si le répertoire a changé, vous devez interroger son chemin avec File.exists (). Java 7 dispose d’un observateur d’annuaire qui peut éviter la nécessité d’une interrogation.

Tout d’abord, je doute que Java n’émette une exception si vous essayez d’écrire dans un fichier manquant. Ce qui peut arriver, c’est que, sous Unix, le fichier est supprimé par l’utilisateur mais que le processus écrit toujours dans un fichier de sauvegarde (copie propre).

Jetez un coup d’œil au paquet de moniteurs de fichiers io d’apache commons: http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/monitor/package-summary.html Vous pouvez vous enregistrer écouteurs pour différents événements (suppression de fichier, suppression de répertoire, etc.) et l’écouteur.

Si vous souhaitez empêcher la suppression, je jetterai un coup d’œil au commentaire de @splash. Une autre option consiste à écrire dans un fichier caché dans un répertoire temporaire de votre choix.

  1. Sous Unix, Linux, Solaris, MacOS, HP / UX, AIX, etc., il n’existe aucun moyen de détecter qu’un fichier ouvert a été supprimé.

  2. Sous Windows, il est impossible de supprimer un fichier ouvert.

Donc, votre question n’a pas de réponse apparente.