C# Excel 互操作错误:文件正在被另一个进程使用

3
在我的项目中,我的目标是编辑和移动文件。为了简化,我已经删除了所有编辑部分,因为它们似乎不会导致错误。我已经使用仅包含此代码的测试出现错误。
这是我的代码:
Application xlApp = new Application();
Workbooks xlWorkbooks = xlApp.Workbooks;
Workbook xlWorkbook = xlWorkbooks.Open(Path.GetFullPath(fileNameWithPath));
Sheets xlWorksheets = xlWorkbook.Sheets;
Worksheet xlWorksheet = xlWorksheets.get_Item(1);
Range xlRange = xlWorksheet.UsedRange;

string fileNameWithExtension = GetFileNameWithExtension(fileNameWithPath);

xlWorkbook.Close(false);
xlApp.Quit();
Marshal.FinalReleaseComObject(xlRange);
Marshal.ReleaseComObject(xlWorksheet);
Marshal.ReleaseComObject(xlWorksheets);
Marshal.ReleaseComObject(xlWorkbook);
Marshal.ReleaseComObject(xlWorkbooks);
Marshal.FinalReleaseComObject(xlApp);
xlRange = null;
xlWorksheet = null;
xlWorksheets = null;
xlWorkbook = null;
xlWorkbooks = null;
xlApp = null;
GC.GetTotalMemory(false);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.GetTotalMemory(true);

File.Move(fileNameWithPath, myNewPath);

在运行此操作时,当应用程序尝试移动文件时,我收到了一个错误消息:由于另一个进程在使用该文件,因此无法访问该文件。我相当确定已关闭所有COM对象并完成了网上找到的所有建议,以使其正常工作。您有什么想法,我可能忽略了什么?

2
我无法仅通过那段代码复制你的问题。在Win 8 / Excel 2013上,打开、关闭并移动文件都没有问题。 - Equalsk
尝试结束任何Excel进程或重新启动计算机。 - Timmo
@Equalsk 看起来我有一些 Excel 进程在运行,当我去任务管理器 --> 详细信息时可以看到。我重新启动了电脑,现在它可以工作了。感谢您的尝试复制;这帮助我让它正常工作! - Alan Schapira
1个回答

2
使用 Sysinternals 工具检查哪个进程导致了此问题。一般来说,在执行这些操作之前,您应该先验证文件是否有写入权限。
验证写入权限的方法如下:
public static bool FileHasWriteAccess(string Path)
{
    try
    {
        System.IO.File.Open(Path, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite).Dispose();
        return true;
    }
    catch (System.IO.IOException)
    {
        return false;
    }
}

请查看:在Windows中找出锁定文件或文件夹的进程


不幸的是,这并不能真正证明它。你可以想象一种情况,FileHasWriteAccess 返回 true,然后另一个进程获取了锁,然后你试图向其写入。 - chris
1
这是真的,但如果在使用文件之前仅锁定一行,机会就非常低。 甚至可以在一个简单的循环中重试给定次数... - BendEg
很少见,但这是一种会收到错误报告的错误类型,很难复现,并且当你忘记了这段代码时很难修复。 - chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接