在旧c#代码中查找文件锁

在旧c#代码中查找文件锁,c#,debugging,file-locking,C#,Debugging,File Locking,我有一个有趣的问题——我继承了一个很大的代码库(棕色字段) 应用程序按计划运行,接收大量数据文件(文本),对其进行处理,然后导出报告并进行清理 我们发现了一个bug,当试图在事后清理时,一些文件会处于锁定状态,即使所有文件活动早已超出范围。这将阻止应用程序在清理期间删除它们 这个应用程序中使用了数百个IO和stream对象等,我想知道从哪里开始查看它们的使用情况 在c#托管代码中,有哪些很好的工具可以用来调查文件锁?您如何使用它们来实现这一点?您可以使用来自系统内部的命令来监视文件访问(读/写)

我有一个有趣的问题——我继承了一个很大的代码库(棕色字段)

应用程序按计划运行,接收大量数据文件(文本),对其进行处理,然后导出报告并进行清理

我们发现了一个bug,当试图在事后清理时,一些文件会处于
锁定状态,即使所有文件活动早已超出范围。这将阻止应用程序在清理期间删除它们

这个应用程序中使用了数百个IO和stream对象等,我想知道从哪里开始查看它们的使用情况


在c#托管代码中,有哪些很好的工具可以用来调查文件锁?您如何使用它们来实现这一点?

您可以使用来自系统内部的命令来监视文件访问(读/写)。 它不是针对c#的,而是一个通用工具,可以用于许多其他事情。注意:您可以将结果导出到csv并在以后进行调查

您可以使用以下指南之一:

  • -如何进行简单的文件监视
  • -更详细的指南,解释如何将结果导出到csv中,您可以稍后进行调查
编辑:

我没有为此找到任何东西,所以如果我是你,我将继承使用的steam,并用日志逻辑将其封装

此日志流对象(例如名为
LogStream
的对象)将在每个方法入口之前写入日志,调用
base.function()
并在完成后写入另一个日志

这样,您可以根据需要监视文件访问。例如,使用
Guid.NewGuid()
记录每个流实例的Id,使用
System.Threading.Thread.CurrentThread.ManagedThreadId
等记录线程Id

通过这种方式,您可以识别实例并缓慢地调查调用


首先要检查流打开和关闭的数量是否相等,在
Dispose()
调用中可能会避免异常。

当您忘记处理拥有文件句柄的父对象时,通常会发生这种情况。例如,您忘记调用文件流的Close/Dispose。当文件句柄在下一次完整GC期间不再被引用时,终结器将清理这些句柄

您可以向Windbg检查是否在终结队列中有准备好终结的SafeFileHandles。可以跟踪这些内容的探查器是YourKit,当您启用探测时,它还可以搜索终结器中关闭的文件,并提供创建调用堆栈,使您能够在代码中搜索有问题的行。
查看工具包的“过程检查”选项卡,查找探针检查

谢谢你的提示-我已经在使用ProcMon了。不幸的是,它只会告诉我持有锁的二进制文件(并不比我现在更好)。我希望对托管代码文件锁调试有更深入的了解。类似于使用WinDbg查看持有锁的方法或类似方法的调用堆栈的方法。思想?