如果我使用Get-ChildItem,是否必须关闭文件

时间:2017-08-23 14:38:38

标签: powershell

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

正如已经提到的,答案是

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

从您对问题的评论中,我感到有些困惑,为什么我不需要在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并与更多"原始"进行交互时,才真正需要它。直接打字

我希望这可以解释你的困惑