File.Exists + File.Move 错误“该进程无法访问该文件,因为它正被另一个进程使用。”

Posted

技术标签:

【中文标题】File.Exists + File.Move 错误“该进程无法访问该文件,因为它正被另一个进程使用。”【英文标题】:File.Exists + File.Move Erroring "The process cannot access the file because it is being used by another process." 【发布时间】:2017-07-09 09:50:50 【问题描述】:

我有一个我认为非常简单的文件移动器脚本。它会检查文件并将其移动到新目录(如果存在):

if (File.Exists(_collection[x,0]))

    System.IO.File.Move(_collection[x, 0], _moveTo);
    MessageBox.Show("File moved because it was stale.");

它通过了文件存在的检查,但是当试图移动它时,下一行出现错误,说明文件正在被另一个进程使用。我只能假设 File.Exists 导致它以某种方式挂断,但无法从遇到此问题的其他任何人那里找到解决方案。

【问题讨论】:

_collectionFileInfo 还是String 的数组? 您是否在任何时候打开过该文件?程序可能没有正确关闭吗? _collection 包含一个字符串,指的是文件的实际路径。并且@pookie 没有文件还没有打开,程序已经重新启动,所以我认为应该没有任何剩余的链接打开它。 你可以在其他地方使用这个文件吗?解决方法是将您的文件复制到新文件夹中,然后删除旧文件。 @C.Fasolin 您是否建议我创建一个临时目录来存储它并将其从那里移动到它的最终目的地?如果是这样,我可以试试。但是尝试移动到临时目录不会仍然有错误吗? 【参考方案1】:

试试这个代码:

    string filePathNameToMove = "";
    string directoryPathToMove = "";

    if (File.Exists(filePathNameToMove))
    
        string destinationFilePathName = 
               Path.Combine(directoryPathToMove, Path.GetFileName(filePathNameToMove));
        if (!File.Exists(destinationFilePathName))
        
            try
            
                File.Move(filePathNameToMove, destinationFilePathName);
                Console.WriteLine("File Moved!");
            
            catch (Exception e)
            
                Console.WriteLine("File Not Moved! Error:" + e.Message);

            
        
    

【讨论】:

因为“试试这个”不是答案。答案应该解释 OP 的代码有什么问题,然后解释如何解决该问题并最终显示执行此操作的代码。您刚刚转储了一些包装在 try-catch 块中的代码,它隐藏了错误但没有解决根本原因。 我投了反对票,因为你 a) 没有解释 b) 写的是 if (bool == false) 而不是 if(!bool)。但解决方案本身是正确的:移动目标必须是文件名,而不仅仅是路径。 OK thk for explication, for bool==false 我喜欢这个签名,因为 !bool 更具可读性 感谢您的回复。现在我的理解是,您必须在移动文件路径之前组合它,这似乎是最终解决方案。谢谢。【参考方案2】:

万一其他人有这个问题。就我而言,该文件已在 Excel 中打开,并且 Excel 在终止后从未被垃圾收集。所以操作系统仍然认为该文件正在被访问。我做了以下,粗略的,但它的工作原理。

                for (int i = 1; i > 0; i++)
                
                     try
                     
                         File.Move(sourceFileName, destinationFileName);
                         break;
                      catch
                     
                         GC.Collect();
                     
                

【讨论】:

以上是关于File.Exists + File.Move 错误“该进程无法访问该文件,因为它正被另一个进程使用。”的主要内容,如果未能解决你的问题,请参考以下文章

git学习解决git提交代码时报错: Unable to create ‘XXX/.git/index.lock‘: File exists.

git学习解决git提交代码时报错: Unable to create ‘XXX/.git/index.lock‘: File exists.

File.Move 不适用于 UNC 路径

使用 System.IO.File.Move 时自动创建文件夹

如何实现异步 File.Delete/Create/Move?

区分大小写的 Directory.Exists / File.Exists