2011-06-06 134 views
3

我一直在努力爭取一段時間。我在調用File.Copy方法後無法訪問文件。這是我嘗試過的:File.Copy方法使文件無法訪問

File.Copy(sourceFile, destinationFile, true); 
FileStream fs = File.Open(destinationFile, FileMode.Open); 

我在第二行收到UnauthorizedAccessException。它說:訪問路徑...被拒絕。我也嘗試過建議here,但那並不奏效。

任何幫助表示讚賞。

編輯:這是我發現的。如果我這樣做:

File.Copy(sourceFile, destinationFile, true); 
FileStream fs = File.Open(destinationFile, FileMode.Open, FileAccess.Read); 

它不會拋出異常。我試圖訪問的文件是隻讀的。所以,我試圖刪除像這樣的只讀屬性:

File.Copy(sourceFile, destinationFile, true); 
FileInfo fileInfo = new FileInfo(destinationFile); 
fileInfo.IsReadOnly = false; 
FileStream fs = File.Open(destinationFile, FileMode.Open, FileAccess.ReadWrite); 

而且我得到和以前一樣的異常。順便說一下,我檢查了是否可以手動打開文件並對其進行編輯,而且我可以。當然,當我取消選中只讀複選框。我還在調試時在Windows資源管理器中檢查了文件屬性,緊接着第三行,並且該文件不再是隻讀的。把所有這些都檢查出來,我不明白爲什麼第四行會拋出異常。

+0

嘗試把一個'System.Threading.Thread.Sleep(1000);'字裏行間,看它是否是一個計時問題(文件可能仍然被鎖定'File.Copy()' – oleschri 2011-06-06 13:22:07

+0

我試圖做出類似的東西,我創建了一個while循環,如果不拋出異常,它應該退出,但它永遠不會退出... – Vale 2011-06-06 13:37:05

+0

您是否試過在複製之前刪除只讀屬性? – leppie 2011-06-07 06:26:18

回答

5

您確定只有使用File.Copy複製的文件無法打開,而不是目標文件夾中的每個文件?這是一個普通的NTFS文件夾或網絡共享?

如果您正在運行防病毒軟件或安全軟件,請嘗試禁用它。文件創建後,他們通常會打開一個文件來掃描它。

更新

根據http://msdn.microsoft.com/en-us/library/b9skfh7s.aspx - UnauthorizedAccessException通過File.Open拋出不會給消息「來......被拒絕的路徑訪問」。 (編輯:我不能看到File.Copy該消息要麼,所以這可能是錯誤的)

我懷疑這是你的File.Copy失敗,除此之外,和你沒有權限讀取源文件或寫入目標文件。您可能正在查看突出顯示的源代碼行,該行顯示要執行的下一行。

所以 - 也許你的複製失敗,而不是File.Open

+0

如果我嘗試打開它沒有第一行,它的作品... – Vale 2011-06-06 12:08:43

+0

並回答我提出的其他觀點...? – 2011-06-06 12:09:17

+0

問題是,該文件最初不存在,比我複製,並嘗試訪問目標文件。我確信我擁有所需的所有權利,因爲我正在應對桌面。 – Vale 2011-06-06 12:11:09

-1

試試這個!


private bool CheckFileHasCopied(string FilePath) 
    { 
     try 
     { 
      if (File.Exists(FilePath)) 
      { 
       using (File.OpenRead(FilePath)) 
       { 
        return true; 
       } 
      } 
      else 
      { 
       return false; 
      } 
     } 
     catch (Exception) 
     { 
      Thread.Sleep(2000); 
      return CheckFileHasCopied(FilePath); 
     } 

    } 

if (CheckFileHasCopied(destinationFile)) { File.Delete(sourceFile); }