处理Java 8项目,我从外部源复制文件。在其中一个源中,使用不可变位标志设置文件。
在 OSX 中设置如此
sudo chflags schg /path/to/file
在 Linux
中chattr +i /path/to/file
我现在需要删除我复制的文件。我一直在使用Apache Commons IO来删除这样的目录,
FileUtils.deleteDirectory(new File("/path/here"));
然而,这会导致java.io.IOException exception
崩溃。
是否有跨平台方式来删除这些文件?正在运行的进程是文件的所有者。
答案 0 :(得分:23)
问题:因为我们知道不可变属性设置的文件不能被任何用户删除。甚至root用户也无法删除以下文件。
现在,为了能够删除文件,您必须删除不可变属性,然后删除该文件。
现在,您需要做的是通过代码应用shell命令并删除文件中的immutable属性。
正如您所提到的跨平台问题
所以基本算法将是
<小时/> 第1步:检测您正在使用的操作系统的示例代码为:
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
注意:我还没有添加用于检查所有操作系统的代码。所以请自己看一下。
第2步:此步骤可帮助您解决跨平台问题
通过java.lang.Runtime.exec
发出相应的shell命令,以删除文件的immutable属性。
看看java.lang.Runtime.exec。
java.lang.Runtime.exec :通过此,您可以为任何底层环境提供适当的shell命令,无论是MAC,Windows,Linux等。
示例代码为
//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.
注意:要运行包含管道的其他shell命令,您可以使用此类示例代码:
Process p = Runtime.getRuntime().exec(new String[]{"csh","-c","cat /home/narek/pk.txt"});
步骤3:使用相同的Runtime.exec()检查是否已删除immutable属性,如下所示:
Process p = Runtime.getRuntime().exec("lsattr /whateverPath");
//Play with the process to check whether the attribute is set or not, using the documentation.
步骤4:如果Step3为true | false,无论您应用何种逻辑,请使用Runtime.exec()再次使用相应的命令删除文件。
要看看java.lang.Runtime.exec的上述链接文档并使用它。
拜托,让我知道它是否有所帮助。
答案 1 :(得分:14)
是否有任何跨平台方式删除这些文件?
不是我能找到的。我不得不采用你已经考虑过的明显的解决方案,很长一段路:
实际上,更简单,更懒惰的捷径是:
/usr/bin/chattr
等)盲目执行解锁命令,使用完整路径以避免可能的安全问题。他们都会很快失败,除了一个;在例如Linux对ATTRIB.EXE
或chflags
的任何调用都将失败。如果他们所有失败,则不支持该系统。lsattr
chattr
),以验证标记删除。java.io.IOException
。我开始研究chattr
做了什么,但很明显,我需要发布几个专门的,特定于操作系统的系统调用:所以没有真正的优势。外部二进制文件,除了性能之外,但在我的情况下这不是问题。
一旦进入特定于操作系统(本机)的道路,通过JNI或JNA,在Linux系统上调用appropriate IOCTL function是一个“简单”的问题。
请注意,仅识别操作系统是不够的,还需要识别文件系统,因为例如, FAT32文件系统或NTFS-3G FS,IOCTL将返回错误(该标志要么在低级别不可用,要么不在IOSS中间驱动程序支持下)。
Python 2.7中存在同样的问题,在高级别上提供了一个独立于操作系统的操作 ...但它无处不在。