代码之家  ›  专栏  ›  技术社区  ›  codymanix

.NET 4.0文件系统枚举功能的奇怪之处

  •  16
  • codymanix  · 技术社区  · 14 年前

    我刚读了一页 "Whats new .NET Framework 4.0" . 我很难理解最后一段:

    删除枚举目录或文件上的打开句柄

    1. 创建自定义方法(或Visual Basic中的函数)以包含 您的枚举代码。

    2. 使用noinling选项应用MethodImplAttribute属性

      [MethodImplAttribute(MethodImplOptions.NoInlining)] Private void Enumerate()

    3. 包括以下方法调用,以便在枚举之后运行

        * The GC.Collect() method (no parameters).
        * The GC.WaitForPendingFinalizers() method.
      

    为什么属性是noinling?内联在这里会有什么危害?

    为什么要手动调用垃圾收集器,为什么不首先让枚举器实现IDisposable?我怀疑他们使用FindFirstFile()/FindNextFile()API调用imlementation,因此在任何情况下,如果枚举完成,都必须调用FindClose()。

    编辑:

    1 回复  |  直到 14 年前
        1
  •  4
  •   Hans Passant    14 年前

    很奇怪。迭代器正确地实现了IDisposable,它调用FindClose()。AllDirectories选项可能是问题的根源,因为FindFileFirst/Next只允许迭代单个目录。但是我看到迭代器做了正确的事情,它在迭代目录结构时只打开了一个句柄。

    MSDN文章特别提到“如果在枚举的目录或文件中有一个打开的句柄”。FindFileFirst/Next不会让手柄打开。但是,在枚举时读取文件的草率用户代码确实如此。”文件或目录上的删除操作“也很重要,我认为Vista中的行为已经改变。DeleteFile()可以成功,但在关闭文件上的所有句柄之前,该文件实际上不会消失。

    我们需要有人自愿 在XP上实现此代码。我想我们很快就会找到人:)