2013-01-19 56 views
1

當前正在開發一個程序設計爲在Windows和OSX上工作,我有這個功能複製一個文件,在Windows中完美的作品,但是當我在osx中​​嘗試它時,我得到一個IOException:「no such文件或目錄」,我研究了一點,發現可能的目標目錄不存在(雖然它確實存在),所以我說這幾行:file.getParentFile()。mkdirs();在osx中​​創建重複的文件夾

if(!f2.getParentFile().exists()) 
{ 
    f2.getParentFile().mkdirs(); 
} 
if(!f2.exists()) 
{ 
    f2.createNewFile(); 
} 

這似乎解決了問題,但我當尋找複製的文件(位於文件)我一開始無法找到它,但後來我看到該程序實際上創建了一個我想保存文件的文件夾,所以我最終得到了兩個文件夾完全相同的「文件」名稱,這裏是代碼的其餘部分:

public static Boolean copyfile(String srFile, String dtFile) 
{ 
    { 
      try 
      { 
      File f1 = new File(srFile); 
      File f2 = new File(dtFile); 
      if(!f2.getParentFile().exists()) 
      { 
       f2.getParentFile().mkdirs(); 
      } 
      if(!f2.exists()) 
      { 
       f2.createNewFile(); 
      } 
      InputStream in = new FileInputStream(f1); 
      OutputStream out = new FileOutputStream(f2); 

      byte[] buf = new byte[1024]; 
      int len; 
      while ((len = in.read(buf)) > 0){ 
      out.write(buf, 0, len); 
      } 
      in.close(); 
      out.close(); 
      System.out.println("File copied."); 
      } 
      catch(FileNotFoundException ex){ 
      System.out.println(ex.getMessage() + " in the specified directory."); 
      JOptionPane.showMessageDialog(new JFrame(), ex.getMessage()); 
      return true; 
      } 
      catch(IOException e){ 
      System.out.println(e.getMessage()); 
      JOptionPane.showMessageDialog(new JFrame(), e.getMessage()); 
      return true; 
      } 
      } 
    return false; 
} 

這顯然不是理想的結果,我該怎麼做才能讓程序識別我想要保存文件的文件夾?

更新:我使用的LS-B命令,並將其顯示在不同的語言的兩個文件夾:「文件」和「Documentos」,即使它們都顯示爲「Documentos」取景

回答

0

如果你使用Java 7,請嘗試使用java.nio.file包。這些錯誤,如果有的話,應該有更翔實:

Path source = Paths.get(srFile); 
Path dest = Paths.get(dtFile); 
Files.createDirectories(dest.getParent()); 
Files.copy(source, dest); 

我建議你避免調用的Throwable的getMessage()方法。它通常會提供除了在異常類旁邊顯示時沒有意義的信息。所以,而不是println(ex.getMessage()),使用println(ex)。當然,比這兩者中的任何一個都更有用的是ex.printStackTrace()

+0

謝謝,但即時通過您提供的代碼得到相同的結果,它的工作原理,但我留下重複的文件夾 –

2

,所以我結束了兩個文件夾具有完全相同的「文件」的名字,

這可能不會發生。這兩個目錄有(可能非常巧妙)不同的名稱。例如,在名稱中可以有一個尾部空格等。

一旦找出名稱中的差異,應該變得非常清楚如何解決問題。

您可以使用以下命令來解決此問題: ls -B應顯示任何不可打印的字符爲\xxx。至於尾隨空格等,請嘗試ls -1 | od -c並仔細檢查輸出。

+0

+1,但也要注意它可能是一些非常棘手的事情(如零寬度非喬伊納,我不知道這將如何結束的名稱,但它可以:P) – Doorknob

+1

@ doorknob:'ls -B'將打印作爲轉義序列。 – NPE

+0

相信我,這就是我的想法,但他們是完全一樣的,我知道這是不可能在Windows上,我不知道,但我認爲它不可能在OSX上,但這就是爲什麼即時通訊如此卡住,除此之外,目的文件名來自JFileChooser,我相信應該返回確切的選定文件名 –

相關問題