2010-11-08 40 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

相关问题