我试图创建一个静态方法,让我隐藏一个文件。我发现了一些可能的方法,我写了这个:
public static void hide(File src) throws InterruptedException, IOException {
if(System.getProperty("os.name").contains("Windows"))
{
Process p = Runtime.getRuntime().exec("attrib +h " + src.getPath());
p.waitFor();
}
else
{
src.renameTo(new File(src.getParent()+File.separator+"."+src.getName()));
}
}
不幸的是,这在windows和Ubuntu上都不起作用…在Oracle的教程中,我发现了这种方法
Path file = ...;
Files.setAttribute(file, "dos:hidden", true);
,但我不知道如何使用它,因为我的JDK没有类"路径"。谁能帮我一个方法,可以在unix操作系统和Windows工作?
Path
类是在Java 7中引入的。
在Java 7之前,没有内置的方法来访问这样的属性,所以你必须做一些类似于你正在尝试的事情(在Unix-y操作系统上没有"隐藏属性",但所有以.
开头的文件默认是隐藏的)。
关于你的exec()
呼叫有一个伟大的(如果有点老)的文章,列出了所有的东西,可能会出错,以及如何修复它(这是一个相当复杂的过程,不幸的是)。
还有一个小提示:new File(src.getParent()+File.separator+"."+src.getName())
可以用new File(src.getParent(), "." + src.getName())
代替,这样会更简洁一些。
如果一个文件不是父文件,getParent()将返回null。也许您想在unix中使用
src.renameTo(new File(src.getParent(), '.'+src.getName()));
Path
在Java 7中可用
您将无法使用标准JDK代码实现这一点。File类提供了一个isHidden方法,但是,它清楚地说明了hidden的概念依赖于文件系统:
测试文件是否由路径名是一个隐藏文件。隐藏的确切定义是系统的。在UNIX系统上,a文件被认为是隐藏的,如果名称以句点字符开头("。")。在Microsoft Windows系统上,a文件被认为是隐藏的,如果已在文件系统。
因此,您需要编写特定于平台的代码(JNI?)来隐藏文件
操作系统检测代码:
public class OperatingSystemUtilities
{
private static String operatingSystem = null;
private static String getOperatingSystemName()
{
if (operatingSystem == null)
{
operatingSystem = System.getProperty("os.name");
}
return operatingSystem;
}
public static boolean isWindows()
{
String operatingSystemName = getOperatingSystemName();
return operatingSystemName.startsWith("Windows");
}
public static boolean isMacOSX()
{
String operatingSystemName = getOperatingSystemName();
return operatingSystemName.startsWith("Mac OS X");
}
public static boolean isUnix()
{
return !isWindows();
}
}
隐藏文件代码
public static String hideFile(String filePath) throws IOException
{
Path path = Paths.get(filePath);
if (OperatingSystemUtilities.isWindows())
{
Files.setAttribute(path, "dos:hidden", Boolean.TRUE, LinkOption.NOFOLLOW_LINKS);
return path.toString();
} else if (OperatingSystemUtilities.isUnix())
{
String filename = path.getFileName().toString();
if (filename.startsWith("."))
{
return path.toString();
}
// Keep trying to rename
while (true)
{
Path parent = path.toAbsolutePath().getParent();
Path newPath = Paths.get(parent + File.separator + "." + filename);
// Modify the file name when it exists
if (Files.exists(newPath))
{
int lastDotIndex = filename.lastIndexOf(".");
if (lastDotIndex == -1)
{
lastDotIndex = filename.length();
}
Random random = new Random();
int randomNumber = random.nextInt();
randomNumber = Math.abs(randomNumber);
filename = filename.substring(0, lastDotIndex) + randomNumber + filename.substring(lastDotIndex, filename.length());
continue;
}
Files.move(path, newPath);
return newPath.toString();
}
}
throw new IllegalStateException("Unsupported OS!");
}
注意,当重命名以隐藏Unix
上的文件时,必须注意避免文件名冲突。这是代码实现的,尽管它不太可能。