C# 未释放DirectoryInfo对象

C# 未释放DirectoryInfo对象,c#,dispose,directoryinfo,C#,Dispose,Directoryinfo,我正在创建一个应用程序,该应用程序通过目录中的目录进行循环,并使用以下代码将目录写入控制台: public void checkDirectory(string directory) { Console.WriteLine("Checking... " + directory); DirectoryInfo di = new DirectoryInfo(directory); try { foreach (DirectoryInfo d in

我正在创建一个应用程序,该应用程序通过目录中的目录进行循环,并使用以下代码将目录写入控制台:

public void checkDirectory(string directory)
{
    Console.WriteLine("Checking... " + directory);

    DirectoryInfo di = new DirectoryInfo(directory);
    try
    {

        foreach (DirectoryInfo d in di.EnumerateDirectories())
        {
            checkDirectory(d.FullName);
        }

    }
    catch (System.UnauthorizedAccessException)
    {
        cantAccessCount++;
        unableToAccess.AppendLine("Cannot access directory " + directory);
    }
}

代码循环遍历所有目录并按预期将目录输出到控制台,但当我在网络路径“\myserver\myfolder”上运行它时,如果我转到并查看“myserver”上打开的文件,它会将目录及其所有子目录显示为打开的文件。是否仍有方法确保在完成这些操作后关闭它们?

可能是由于递归调用导致的。EnumerateDirectory有一个重载版本,它接受SearchOption参数。它使您能够遍历所有子目录:

foreach (DirectoryInfo d in di.EnumerateDirectories("*", SearchOption.AllDirectories))
{
    Console.WriteLine(d.FullName);
}

我刚刚测试了我不久前编写的一些代码,它没有在服务器上为我显示任何打开的目录(或文件),只是打开会话本身,您可以测试它:

class Program
{
    static ConcurrentQueue<string> dirQueue = new ConcurrentQueue<string>();

    static void Main(string[] args)
    {
        dirQueue.Enqueue(@"\\SomePC\SomeFolder");
        fetch();
        Console.ReadLine();
    }

    static void fetch()
    {
        string currentDirectory;

        do
        {
            if (dirQueue.TryDequeue(out currentDirectory))
            {
                try
                {
                    IEnumerable<string> newDirectories = Directory.EnumerateDirectories(currentDirectory, "*.*", SearchOption.TopDirectoryOnly);
                    Array.ForEach(newDirectories.ToArray(), dirQueue.Enqueue);

                    Console.WriteLine("{1}", currentDirectory);
                }
                catch (UnauthorizedAccessException ex)
                {
                    Debug.WriteLine(ex.Message);
                }
            }
        } while (!dirQueue.IsEmpty);
    }
}
类程序
{
静态ConcurrentQueue dirQueue=新ConcurrentQueue();
静态void Main(字符串[]参数)
{
dirQueue.Enqueue(@“\\SomePC\SomeFolder”);
fetch();
Console.ReadLine();
}
静态void fetch()
{
字符串目录;
做
{
if(dirQueue.TryDequeue(out currentDirectory))
{
尝试
{
IEnumerable newDirectories=Directory.EnumerateDirectories(currentDirectory,“***”,SearchOption.TopDirectoryOnly);
ForEach(newDirectories.ToArray(),dirQueue.Enqueue);
WriteLine(“{1}”,currentDirectory);
}
捕获(未经授权的访问例外)
{
Debug.WriteLine(例如消息);
}
}
}而(!dirQueue.IsEmpty);
}
}

这只是我拼凑的一个快速副本,原始版本是一个线程版本,因此您可能需要更改一些内容。

@mason
checkDirectory
是此代码使用的方法的名称in@mason这是一种递归方法问题中的代码是checkDirectory,它为找到的每个子目录调用自己。我假设
DirectoryInfo
对象或
EnumerateDirectories
将打开该目录。您可以尝试使用
目录.GetDirectories
。我添加此评论是因为我不完全确定这是否可行。我认为这是可能的,它取决于文件服务器的实现以及安装了何种反恶意软件产品。到底出了什么问题?如果什么都没有,那就忽略吧。如果你确实有一个使你的程序失败的具体问题,那么你必须把它记录下来。谢谢你的建议,但结果是一样的。恐怕我仍然会收到打开的文件