如何设置文件的隐藏属性

时间:2011-04-26 10:51:51

标签: java windows file hide

我正在尝试创建一个让我隐藏文件的静态方法。 我找到了一些可能的方法,我写了这个:

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中使用的方法吗?

4 个答案:

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