2017-08-23 7 views
1

Im Get-ChildItemを使用してフォルダ内のファイルを読み取った後、各ファイルのlastwritetimeを取得して並べ替えます。Get-ChildItemを使用する場合、ファイルを閉じる必要がありますか?

lastwritetimeを取得した後にファイルを閉じる必要がありますか?

+3

'は、Get-ChildItem'は「オープン」しませんあなたの混乱にいくつかの光を当てる願っています必要なのメタデータの基礎となるAPIを要求します_about_ファイル - 閉じられるものは何もありません –

+0

いいえこれはファイルの情報の一覧です。ストリームやロックは行われません。 – ArcSet

+2

@ MathiasR.Jessen - コメントとしてではなく、答えとして書く - 質問に対する正しい返答であることは間違いありません。 –

答えて

1

いいえこれは、ファイルの情報の一覧です。ストリームやロックが行われていません

0

すでに言及したように、答えはです。です。

ファイルシステムに対してGet-ChildItemを使用する場合、それは実際にすべてのファイルを開かないことであることの理由 - それは、ファイルシステムでは約ファイルのメタデータを返す基本的なAPIを問い合わせ - そうに何のファイルハンドルがありません「閉じた」。


あなたの質問のコメントから、「私はPowerShellでシステムリソースの割り当てを管理する必要はないのですか?

PowerShellは.NETで動作し、.NETランタイムはガベージコレクションされます。メモリブロックがポインタによって参照されなくなった後のある時点(未定義)で、ガーベジコレクタが解放され、このプロセスを自分で管理することについて心配する必要はありません。

リソース割り当てがランタイムの外部にあり、管理する必要がある状況もありますが、.NETの通常のパターンは、アンマネージリソースに依存するクラスを定義するときにIDisposableインターフェイスを実装することです。例はStreamReader(テキストファイルを読むことができる)です。 PowerShellで

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

、そのような意味的な構築物はありません:C#では、自動的に実行がこれは必須ですした範囲を離れると、そのようなオブジェクトを処分するusingディレクティブを使用することができます。基になる機能の開発 - このすべて例えばGet-Contentを呼び出すときにあなたから離れて隠されている。もちろん、

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

:多くの使い捨てのオブジェクトを割り当てることtry/finallyブロックでそれらをラップしているとき、私は通常、何をしますファイルシステム提供者は、パイプラインの実行が停止するまでにすでにオブジェクトを破棄しています。あなたがあなた自身のコマンドレットを書き、より「原始的」なタイプと対話したいときには、実際には、ファイルを直接

私はこれが

関連する問題