DirectoryInfo对象未发布

时间:2017-02-17 16:43:14

标签: c# dispose directoryinfo

我正在创建一个循环遍历目录中目录的应用程序,使用以下代码将它们写入控制台:

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”上查看我打开的文件它将目录及其所有子目录显示为打开的文件。无论如何都要确保它们在完成后关闭?

2 个答案:

答案 0 :(得分:0)

由于递归调用,可能会发生这种情况。 EnumerateDirectories的重载版本接受SearchOption参数。它使您可以遍历所有子目录:

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

答案 1 :(得分:0)

我刚刚测试了一段时间我写过的一些代码,它没有在开放会话本身的服务器上显示任何打开的目录(或文件),你可以测试一下:

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

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