2010-04-18 31 views
15

我刚刚读了一页"Whats new .NET Framework 4.0"。我听不太懂的最后一段:.NET 4.0文件系统枚举功能的奇怪之处

要在列举的目录或文件

  1. 创建一个自定义的方法(或Visual Basic功能)包含 您的枚举代码删除打开的句柄。

  2. 将MethodImplAttribute属性与无内插选项 一起应用于新方法。例如:

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

  3. 包括以下几个方法调用,您枚举 代码后运行:

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

为什么属性NoInlining?内联会造成什么危害?

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

编辑:

没有任何人有一个想法,为什么NoInlining属性建议的文章?

+4

哇。我并不希望在MSDN的建议中看到* * * – 2010-04-18 19:34:23

+0

我很惊讶地看到这一点,但请注意文章中列出的特殊情况:“如果您运行的是Windows XP或更早版本,则删除如果在枚举的目录或文件之一上存在打开的句柄,则枚举之后的文件或目录上的操作可能会失败,如果发生这种情况,则必须引发垃圾回收来移除打开的句柄。 – 2010-04-18 19:44:51

+0

@布莱恩 - 如果它只适用于XP我满足...... ish。 – 2010-04-18 19:59:28

回答

4

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

MSDN文章特别提到“如果在枚举的目录或文件之一上存在打开的句柄”。 FindFileFirst/Next不会使句柄处于打开状态。但是,在枚举时读取文件的用户代码不够用。 “对文件或目录的删除操作”也是相关的,我认为Vista中的行为发生了变化。 DeleteFile()可以成功,但文件不会真正消失,直到文件上的所有句柄都关闭。

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