2010-11-08 146 views
3

我在我的窗口服務的方法如下:System.IO.IOException:該進程無法訪問文件「FILE_NAME」

System.IO.File.Copy(path, ConfigurationManager.AppSettings["BulkInsertGiftRegisterCreatorDirectory"] + System.IO.Path.GetFileName(path)); 

Loyalty.Entity.Base.FileInfo file = new Loyalty.Entity.Base.FileInfo(); 
file.FileName = path; 
request.Object = file; 

ResponseBase response = new ResponseBase(request); 
RequestConnection connection = new RequestConnection("cn"); 
FileManager fileManager = new FileManager(request, connection); 
response = fileManager.OfflineGiftRegisterBulkInsert(); 

System.IO.File.Delete(ConfigurationManager.AppSettings["BulkInsertGiftRegisterCreatorDirectory"] + System.IO.Path.GetFileName(path)); 

// here is the part of stored procedure that uses file 
SELECT @SCRIPT= 'BULK INSERT GIFT_CARD.GIFT_TEMP' 
          +' FROM ''' 
          + @FILE_PATH 
          +''' WITH (' 
           +'FIELDTERMINATOR = '','',' 
           + 'KEEPNULLS' 
          +');' 

我可以用手從文件系統刪除文件,但是這個代碼說我「Ooops!System.IO.IOException:進程無法訪問文件的'文件名' ,因爲它正在被另一個進程使用。」

我已經搜索了相似的問題,在stackoverflow和其他地方。但我找不到任何東西來幫助我。複製或刪除方法返回無效,我沒有流在我的代碼來處置。

我該如何解決?

在此先感謝。

+2

什麼是「做其他事」的一部分在做什麼?我假設它正在做* *文件被複制/刪除。我有這種感覺,這件事很重要。 – 2010-11-08 21:29:09

+0

您的Window服務是否以與您相同的身份運行?如果沒有,那麼Window的服務可能沒有刪除文件的權限。 – ChrisNel52 2010-11-08 21:35:46

+0

我調用一個存儲過程,該存儲過程使用文件的路徑批量插入文件包含的行。 – anilca 2010-11-08 21:35:50

回答

4

在查看代碼之前,您可能需要使用process explorer來確定哪個進程具有句柄。這可能排除你有沒有想過

更新的一些問題

由於您使用的定時器,你必須確保你的方法是可重入和你沒有任何競爭條件..如計時器的打勾速度比您處理事件的速度快。

this question this answer

5

這裏有一個方法可以用來檢查文件是否在使用中:

public static System.Boolean FileInUse(System.String file) 
{ 
    try 
    { 
     if (!System.IO.File.Exists(file)) // The path might also be invalid. 
     { 
      return false; 
     } 

     using (System.IO.FileStream stream = new System.IO.FileStream(file, System.IO.FileMode.Open)) 
     { 
      return false; 
     } 
    } 
    catch 
    { 
     return true; 
    } 
} 

此外,等待我作出了文件:

public static void WaitForFile(System.String file) 
{ 
    // While the file is in use... 
    while (FileInUse(file)) ; // Do nothing. 
} 

我希望這有助於!

+0

這不是一個Windows應用程序@Vercas。這是一個Windows服務。 – anilca 2010-11-08 22:09:21

+0

@anilca那麼請原諒。我從來沒有使用Windows Service(s),所以我只是讓它不做任何事情。 – Vercas 2010-11-08 22:16:56

1

更好的解決方案,是使用功能FileInUse之前,這個代碼兩行補充說Vercas表明:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
+0

請解釋爲什麼這是更好的解決方案。另外,一般來說,答案應該能夠自立。現在,這看起來更像是評論或答覆,而不是答案。 – 2014-05-27 15:02:58

+0

我說這是一個更好的解決方案,因爲我測試了它。我遇到了同樣的問題,一個File.Copy後跟一個File.Delete會給我錯誤。 首先,我只用「FileInUse」進行測試,並且它工作。但系統需要10到15秒才能刪除文件。 然後我用我在這裏分享的幾條線進行測試,它在某些情況下有效,而其他情況則不適用。 所以我結合了兩種解決方案: 首先我調用我在這裏共享的兩條線,然後用函數「FileInUse」測試該文件,最後調用「File.Delete」。它的功能就像一個魅力,並且文件幾乎立即被刪除。 – user2501815 2014-05-27 17:15:28

相關問題