2012-08-13 195 views
0

我想將文件上傳到兩個不同的目錄。但它不知何故將文件複製到一個目錄,但無法複製到第二個目錄。將文件從臨時目錄複製到兩個不同的目錄失敗

文件我的src目錄下是這樣

C:\路徑\到\ TEMP

而且我的目標目錄都是這樣

C:\路徑\ to \ destination \ 1 & C:\ path \ to \ destination \ 2

目錄1和2正在動態創建。

這是我在用我的代碼

public final static boolean move(String src, String dest, boolean createDestDir, boolean overwrite) { 
    try{ 
     if(src == null || src.length() == 0 || dest == null || dest.length() == 0){ 
      return false; 
     } 
     File srcFile = new File(src); 
     if(srcFile.isFile() == false){ 
      return false; 
     } 

     String destPath = path(dest); 
     String destFileName; 
     if (destPath.equals(dest)) { 
      destFileName = srcFile.getName(); 
     } else { 
      destFileName = name(dest); 
     } 
     File destDir = new File(destPath); 
     if (destDir.exists() == false) { 
      if (createDestDir == false) return false; 
      if (destDir.mkdirs() == false) { 
       return false; 
      } 
     } 
     File destFile = new File(destPath + destFileName); 
     if (destFile.exists()) { 
      if (overwrite == false) return false; 
      if (destFile.delete() == false) { 
       return false; 
      } 
     } 
     return srcFile.renameTo(destFile); 
    } 

} 

在我的循環srcFile.isFile()失敗第二次,它工作第一次,但沒有第二次。

+1

請顯示「其餘代碼」 – Qnan 2012-08-13 15:35:35

回答

1

mkdirs方法在文件路徑中創建任何缺失的父目錄。例如。如果目標位置是C:\ some \ path \ to \ file \,那麼如果您調用mkdirs,它將檢查C:\ some存在,然後C:\ some \ path等等。如果路徑不存在,它將創建該文件夾並繼續。當它結束時,它將只有,如果必須創建任何文件夾,則返回true。如果目錄結構存在,它將返回false。

在代碼中,你有這樣的:

File destDir = new File(destPath); 
if (destDir.exists() == false) { 
    if (createDestDir == false) return false; 
    if (destDir.mkdirs() == false) { 
     return false; 
    } 
} 
File destFile = new File(destPath + destFileName); 
if (destFile.exists()) { 
    if (overwrite == false) return false; 
    if (destFile.delete() == false) { 
     return false; 
    } 
} 

我不知道爲什麼你通過創建目錄結構的這樣一個令人費解的方式。而不是整個createDestDir變量(我懷疑它是false,當它應該是true)時,您可以調用mkdirs()方法。如果目錄結構已經存在,那麼就不用調用那個方法。

然後在您的下一位代碼中,檢查文件系統上是否已存在該文件。如果它確實存在,並且您沒有將overwrite布爾值設置爲true,那麼您嘗試刪除該文件。但是在任何時候你都不會打電話給createNewFile()。你永遠不會在文件系統上創建文件。

嘗試用這種替代上面的代碼:

new File(destPath).mkdirs(); 
File destFile = new File(destPath + destFileName); 
if (destFile.exists()) 
    if (!overwrite) { 
     return false; 
    } else { 
     destFile.delete(); 
    } 
} 
destFile.createNewFile(); 

如果必要的話這將創建目標目錄,檢查該文件是否存在等(如果允許和必要刪除),然後建立檔案在那個位置。

此外,你應該檢查,以確保destPath以文件分隔符結束 - 例如。 Linux/Unix中的「/」或Windows中的「\」 - 否則destPath + destFileName會帶給你一些不可思議的東西。

+0

但是我的代碼在srcFile.isFile()失敗,所以這應該是沒有問題的。 srcFile.isFile()正在給我返回「false」。 – yogsma 2012-08-13 16:38:03

+0

@yogsma - 如果'srcFile'不存在,'isFile()'將返回false。嘗試調用'srcFile.exists()'。 – 2012-08-13 16:47:04

+0

@yogsma - 'isFile()'第二次失敗,因爲您從未第一次創建文件。它應該第一次工作,因爲你在源文件中調用它。但是,然後你將你的srcFile切換到你永遠不會創建的目標文件*。由於該文件從不創建,因此'isFile()'返回false。 – 2012-08-13 17:16:36

相關問題