识别进程句柄并锁定托管代码中的文件

时间:2009-09-11 12:37:50

标签: c# .net

我使用DotNetZip库在文件夹中压缩文件。要识别当前由其他进程打开的文件,我使用的是来自SysInternals.com的“handle.exe”。我这样做是通过参数调用它并解析输出,沿着这些行。

using (Process handleProcess = new Process())
{
    // -- Set up the parameters and call the process.
    handleProcess.StartInfo.FileName = "handle.exe";
    handleProcess.StartInfo.UseShellExecute = false;
    handleProcess.StartInfo.RedirectStandardOutput = true;
    handleProcess.StartInfo.Arguments = "-u " + fileName;
    handleProcess.Start();
...

哪个有效,但有一个关于它的空气。任何人都可以在托管代码中建议更好的方法吗?

2 个答案:

答案 0 :(得分:1)

以下代码显示了其他进程打开的文件:

SelectQuery query = new SelectQuery("select name from cim_datafile");
using (ManagementObjectSearcher searcher = new
ManagementObjectSearcher(query))
{
    foreach (ManagementObject mo in searcher.Get())
    {
        Console.WriteLine("File Name: {0} \nIs currently opened", mo.Properties["Name"].Value);
    }
}

它是this的略微修改版本。

答案 1 :(得分:0)

See the answers in a similar question asked on SO。在另一个问题using interop was suggested(以及其他人也建议使用SysInternals)。

无论你做什么,都需要重试逻辑。在编写适配器之前,我必须重试。重试逻辑本身封装在 RetryTracker 类中,其中包含不同算法的子类(例如线性延迟,步进延迟等)。