Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Excel互操作错误:另一个进程正在使用该文件_C#_Excel - Fatal编程技术网

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

C#Excel互操作错误:另一个进程正在使用该文件,c#,excel,C#,Excel,在我的项目中,mt的目标是编辑和移动文件。为了简单起见,我删除了所有的编辑部分,因为它们似乎不会导致错误。我已经用这段代码测试了这个错误,但它仍然存在 这是我的代码: Application xlApp = new Application(); Workbooks xlWorkbooks = xlApp.Workbooks; Workbook xlWorkbook = xlWorkbooks.Open(Path.GetFullPath(fileNameWithPath)); Sheets xlW

在我的项目中,mt的目标是编辑和移动文件。为了简单起见,我删除了所有的编辑部分,因为它们似乎不会导致错误。我已经用这段代码测试了这个错误,但它仍然存在

这是我的代码:

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对象,并且已经完成了所有我可以在网上找到的建议,以使其正常工作。关于我遗漏了什么,你有什么想法吗?

使用sysinterals来检查是哪个进程导致了这个问题。一般来说,如果您具有文件的写访问权限,我会在执行这些操作之前进行验证

验证写入访问的方法:

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;
    }
}

请看:

我不能用那种代码复制你的问题。打开、关闭并移动文件而不会出现问题。(Win 8/Excel 2013)尝试终止Excel的任何进程或执行以下操作:reboot@Equalsk似乎我运行了一些excel的东西,当我转到任务管理-->详细信息时可以看到这些东西。我重新启动了电脑,它现在可以工作了。感谢您尝试复制;这帮我让它工作起来了!不幸的是,这并不能证明这一点。您可能会遇到这样一种情况,
FileHasWriteAccess
返回
true
,然后另一个进程获得锁,然后您尝试对其进行写入。这是真的,但如果在使用文件前仅锁定一行,则可能性非常低。你甚至可以在一个简单的循环中进行一定次数的重试……这很少见,但这是一种你会得到错误报告的错误类型,不能很好地重现它,并且当你忘记了这段代码时,通常很难修复它。