【问题标题】:how to set Hidden proprerty of a file如何设置文件的隐藏属性
【发布时间】:2011-08-12 22:51:36
【问题描述】:

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

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 没有“Path”类。 谁能帮我提供一种适用于 unix OS 和 Windows 的方法?

【问题讨论】:

    标签: java windows file hide


    【解决方案1】:

    Path 类是在 Java 7 中引入的。

    在 Java 7 之前,没有内置的方式来访问这样的属性,所以你必须做一些类似于你正在尝试的事情(在 Unix-y 操作系统上没有“隐藏属性”,但是所有以. 开头的文件都默认隐藏)。

    关于您的exec() 电话,a great (if a bit old) article 列出了所有可能出错的内容以及如何解决它(不幸的是,这是一个相当复杂的过程)。

    还有一个小提示:new File(src.getParent()+File.separator+"."+src.getName()) 可以替换为new File(src.getParent(), "." + src.getName()),这样会更简洁一些。

    【讨论】:

    • 非常感谢!您的帮助非常有用!无论如何,对不起我的英语:S
    【解决方案2】:

    如果文件不是父文件,getParent() 将返回 null。也许你想要的 unix 是

    src.renameTo(new File(src.getParent(), '.'+src.getName()));
    

    Path 在 Java 7 中可用。

    【讨论】:

      【解决方案3】:

      您将无法使用标准 JDK 代码实现此目的。 File 类提供了一个 isHidden 方法,但是,它清楚地表明 hidden 的概念是依赖于文件系统的:

      测试这个命名的文件是否 abstract pathname 是一个隐藏文件。 隐藏的确切定义是 依赖于系统。在 UNIX 系统上,一个 如果文件被认为是隐藏的 名称以句点字符开头 ('.')。在 Microsoft Windows 系统上, 如果文件被认为是隐藏的 已在 文件系统。

      因此,您需要编写特定于平台的代码(JNI?)来隐藏文件。

      【讨论】:

        【解决方案4】:

        操作系统检测代码:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-13
          • 2015-02-01
          • 1970-01-01
          • 2014-12-30
          • 1970-01-01
          相关资源
          最近更新 更多