30 votes

Java comment supprimer un fichier dont le bit IMMUTABLE est défini

Travail sur Java 8 projet où j'ai copier les fichiers à partir de sources externes. Dans l'une de ces sources d'un fichier est défini avec l'immuable indicateur de bit.

Dans OSX il est défini comme

sudo chflags schg /path/to/file

Dans Linux

chattr +i /path/to/file

J'ai maintenant besoin de supprimer les fichiers que j'ai copié. J'avais été en utilisant Apache Commons IO pour supprimer le répertoire comme,

FileUtils.deleteDirectory(new File("/path/here"));

Toutefois, cela se bloque avec un java.io.IOException exception.

Est-il de la Croix-Plate-forme de façon à supprimer ces fichiers? Le processus en cours d'exécution est le propriétaire du fichier.

23voto

Tahir Hussain Mir Points 1690

Problème : Depuis, nous savons que le fichier avec l' attribut immuable ensemble, ne peut pas être effacée par tout utilisateur. Même Le super-utilisateur ne peut pas supprimer le fichier suivant.

Maintenant, pour être en mesure de supprimer le fichier que vous devez supprimer l'attribut immuable et puis supprimez le fichier.

Maintenant, ce que vous avez à faire est d'appliquer la commande shell à travers le code et supprimer l'attribut immuable sur le fichier.

Comme vous l'avez mentionné la croix-plate-forme de question

Donc l'algo de base serait


Étape 1:

Détecter le système d'exploitation que vous utilisez
exemple de code serait:

private static String OS = System.getProperty("os.name").toLowerCase();
if(OS.indexOf("win") >= 0)
    //your code for windows OS.
else if(OS.indexOf("mac") >= 0)
    //your code for MAC OS.
else if(OS.indexOf("sunos") >= 0)
    //your code for Solaris OS

Note: je n'ai pas ajouté de code de vérification de tous les OS. Alors jetez un oeil par vous-même.
Etape 2: Cette étape vous aide à résoudre la Croix-plate-forme de question
Problème de l'environnement appropriée commande grâce à l' java.lang.Runtime.exec pour supprimer l'attribut immuable du fichier.
Regarder le java.lang.Moment de l'exécution.exec.
java.lang.Moment de l'exécution.exec : Grâce à cela, vous offre l'environnement appropriée de commande pour n'importe quel Environnement, que ce soit MAC, Windows, Linux, etc.

exemple de code serait

//if the OS detected is Linux then
Process p = Runtime.getRuntime().exec("chattr -i /path/to/file");
//Play with the process as you would like to, using the documentation.
//else if the OS detected is OSX then : example to unlock in OSX
Process p = Runtime.getRuntime().exec("chflags nouchg /path/to/file");
//Play with the process as you would like to, using the documentation.
//else if the OS detected is say Windows then : example to unlock in    Windows
Process p = Runtime.getRuntime().exec("ATTRIB -s -h /path/to/file");
//-s -h are used to unlock and unhide (i dont the Antonym of hide :p ) the file in windows
//Play with the process as you would like to, using the documentation.

Remarque: Pour exécuter d'autres commandes shell qui comprennent des tuyaux vous pouvez utiliser ce genre de code:

Process p = Runtime.getRuntime().exec(new String[]{"csh","-c","cat /home/narek/pk.txt"});


Étape 3: Utiliser le même moment de l'Exécution.exec() pour vérifier si l'attribut immuable a été supprimé ou non, comme ceci:

Process p = Runtime.getRuntime().exec("lsattr /whateverPath");
//Play with the process to check whether the attribute is set or not, using the documentation.


Étape 4: Si l'étape 3 est de type " vrai|faux, quelle que soit la logique d'appliquer, puis Supprimez le fichier à l'aide de votre commande, en utilisant à nouveau le moteur d'Exécution.exec().

La chose est d'avoir un regard sur les ci-dessus liés à la documentation de java.lang.Moment de l'exécution.exec et de travailler avec elle.
s'il vous plaît, laissez-moi savoir si il a contribué dans une certaine mesure, ou pas.

14voto

lserni Points 19089

Est-il de la Croix-Plate-forme de façon à supprimer ces fichiers?

Non pas que j'ai pu trouver. J'ai dû adopter la solution la plus évidente-vous déjà considéré, le long chemin de ronde:

  • détecter sur quel système d'exploitation, je suis en cours d'exécution,
  • problème de l'environnement appropriée de commande pour supprimer l'immuable peu
  • Vérifier qu'il a été supprimé.
  • et enfin supprimer (dans mon cas, les modifier) le fichier.

En fait une plus simple, et lazier, raccourci serait:

  • exécuter la commande de déverrouillage à l'aveuglette pour les fichiers binaires (/usr/bin/chattr, etc.), avec chemin d'accès complet pour éviter d'éventuels problèmes de sécurité. Ils seront tous rapidement échouer, sauf un; par exemple sur Linux à l'appel d' ATTRIB.EXE ou chflags échouent. Si ils tout d'échec, le système n'est pas pris en charge.
  • exécuter avec les paramètres appropriés de l'un binaire qui n'a pas manqué, ou la case correspondante fichier binaire (par exemple, lsattr pour chattr), afin de vérifier le retrait du pavillon.
  • ou vous pouvez juste essayer de supprimer le fichier, et attraper java.io.IOException.

J'ai commencé à chercher dans ce qu' chattr a fait, mais il a été immédiatement clair qu'il y avait plusieurs spécialisées, OS système d'appels, j'aurais besoin de question: donc, il n'y a pas de réel avantage par rapport à l'appel d'un binaire externe, à l'exception peut-être de la performance, mais ce n'était pas un problème dans mon cas.

Une fois que l'on va sur le système d'exploitation spécifique (natif) de la route, soit au moyen de la JNI ou de la JNA, sur un système Linux, c'est une "simple" question de l'invocation de la approprié en fonction IOCTL.

Notez qu'il n'est pas suffisant pour identifier le système d'exploitation, vous devez également identifier le système de fichiers, parce que sur, par exemple, les systèmes de fichiers FAT32 ou NTFS-3G Sfs, l'IOCTL retournera un message d'erreur (le drapeau n'est pas disponible à un faible niveau, ou pas (encore) pris en charge par le IOSS pilote intermédiaire).

Le même problème existe en Python 2.7, où à un haut niveau d'un OS indépendant d'appel est fourni... mais il ne fonctionne pas partout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X