【问题标题】:Do I have to close a file if I use Get-ChildItem如果我使用 Get-ChildItem 是否必须关闭文件
【发布时间】:2017-08-23 14:38:38
【问题描述】:

我使用 Get-ChildItem 读取文件夹中的文件,然后获取每个文件的 lastwritetime 并对它们进行排序。

在获取 lastwritetime 后是否必须关闭文件?

【问题讨论】:

  • Get-ChildItem 不会“打开”文件,它会向底层 API 询问 关于文件的元数据 - 没有什么可以关闭
  • 没有。这只是文件的信息列表。没有流或锁发生。
  • @MathiasR.Jessen - 将其写成答案,而不仅仅是评论 - 这是对问题的正确回答,毫无疑问。
  • @MathiasR.Jessen 谢谢,这是有道理的。
  • @ArcSet 所以如果我使用 System.IO.File]::Exists 检查文件是否存在,那会创建我应该释放的内存吗?

标签: powershell


【解决方案1】:

没有。这只是文件的信息列表。没有流或锁发生

【讨论】:

    【解决方案2】:

    如前所述,答案是

    原因是当您对文件系统使用Get-ChildItem 时,它实际上并没有打开任何文件 - 它会询问底层 API,然后返回元数据 about 文件系统中的文件 -所以没有要“关闭”的文件句柄。


    从您提出的问题中,我感到有些困惑,“为什么我不需要在 PowerShell 中管理系统资源分配?”

    PowerShell 在 .NET 上运行,并且 .NET 运行时是垃圾收集的。在内存块不再被任何指针引用后的某个(未定义)时间点,垃圾收集器将负责释放它,您无需担心自己管理此进程。

    当然,在某些情况下,资源分配在运行时外部,必须进行管理,但 .NET 中的常见模式是在定义依赖于非托管资源的类时实现 IDisposable 接口。一个例子是StreamReader(您可以使用它读取文本文件)。在C# 中,您可以使用using 指令在执行离开所需范围后自动处理此类对象:

    using(StreamReader reader = File.OpenText("C:\path\to\file.txt"))
    {
        // use reader in here
    }
    // at this point, reader.Dispose() has been called automatically
    

    在 PowerShell 中,没有这样的语义结构。在分配许多一次性对象时,我通常会做的是将它们包装在 try/finally 块中:

    try {
        $FileReader = [System.IO.File]::OpenText("C:\path\to\file.txt")
        # user $FileReader here
    }
    finally {
        if($FileReader -ne $null){
            $FileReader.Dispose()
        }
    }
    

    当然,当调用Get-Content 时,所有这些都对你隐藏了——文件系统提供程序中底层函数的开发人员已经在管道停止运行时处理了对象。只有当您想编写自己的 cmdlet 并直接与更多“原始”类型交互时才需要它

    我希望这能阐明你的困惑

    【讨论】:

      猜你喜欢
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 2013-10-29
      • 2015-11-17
      相关资源
      最近更新 更多