我正在尝试创建一个让我隐藏文件的静态方法。 我找到了一些可能的方法,我写了这个:
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()));
}
}
Unfortunatley这不适用于Windows,也不适用于Ubuntu ...... 在Oracle的课程中,我发现了这种方式
Path file = ...;
Files.setAttribute(file, "dos:hidden", true);
但我不知道如何使用它,因为我的JDK没有“Path”类。 任何人都可以帮我一个可以在unix操作系统和Windows中使用的方法吗?
答案 0 :(得分:2)
Java 7中引入了Path
类。
在Java 7之前没有内置的方法来访问这样的属性,所以你必须做一些类似于你正在尝试的东西(在Unix-y OS上没有“隐藏属性”,但是所有以.
开头的文件都默认隐藏。
关于exec()
来电,a great (if a bit old) article列出了可能出错的所有内容以及如何修复它(不幸的是,这是一个非常复杂的过程)。
还有一个小注:new File(src.getParent()+File.separator+"."+src.getName())
可以替换为new File(src.getParent(), "." + src.getName())
,这会更加清晰。
答案 1 :(得分:0)
如果文件不是父文件,则getParent()将返回null。也许你想要unix的是
src.renameTo(new File(src.getParent(), '.'+src.getName()));
Java 7中提供了 Path
。
答案 2 :(得分:0)
您将无法使用标准JDK代码实现此目的。 File类提供了一个isHidden方法,但是,它明确指出hidden的概念依赖于文件系统:
测试由此命名的文件 abstract pathname是一个隐藏文件。 隐藏的确切定义是 取决于系统。在UNIX系统上,a 文件被认为是隐藏的 名称以句点字符开头 ( '')。在Microsoft Windows系统上,a 如果文件被认为是隐藏的 已被标记为 文件系统。
因此,您需要编写特定于平台的代码(JNI?)来隐藏文件。
答案 3 :(得分:0)
操作系统检测代码:
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
上的文件时,必须注意避免文件名冲突。这是代码实现的,尽管不太可能。