如何设置文件的隐藏属性



我试图创建一个静态方法,让我隐藏一个文件。我发现了一些可能的方法,我写了这个:

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上的文件时,必须注意避免文件名冲突。这是代码实现的,尽管它不太可能。

相关内容

  • 没有找到相关文章

最新更新