2011-04-26 46 views
1

我正試圖創建一個靜態方法讓我隱藏文件。 我已經發現了一些可能的方式做到這一點,我寫了這個:如何設置文件的隱藏屬性

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的tuorials我發現這種方式

Path file = ...; 

Files.setAttribute(file, "dos:hidden", true); 

但我不知道如何使用它,因爲我的JDK沒有「路徑」類。 任何人都可以幫助我的方法,可以在Unix操作系統和Windows中工作?

回答

2

Path類是在Java中引入了7

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()),這會更清潔一些。

+0

非常感謝!你的幫助一直非常有用!無論如何抱歉我的英語:S – Wallkan 2011-04-26 11:34:56

0

如果文件不是父項,getParent()將返回null。也許你想爲UNIX是

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

Path有Java 7

0

您將無法使用標準JDK代碼實現此目標。 File類提供了一個方法是否隱藏,但是,它明確指出,隱藏的概念是相關的文件系統:

測試此 抽象路徑名指定的文件是否是一個隱藏文件。 隱藏的確切定義是 系統相關。在UNIX系統上,如果 文件的名稱以句點字符 ('。')開頭,則認爲該文件被隱藏。在Microsoft Windows系統上,如果文件 已在 文件系統中標記爲 文件,則該文件被視爲隱藏。

因此,您需要編寫特定於平臺的代碼(JNI?)來隱藏文件。

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文件時,以避免文件名衝突。這是代碼實現的內容,儘管它不太可能。

相關問題