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