コンピュータや音楽の事書いてます

[powershell]巨大なテキストファイルの最後の方だけ見るのに時間がかかる

PS> dir \\リモートのPC\巨大ファイル

    ディレクトリ: \\xxxx\xxx\bin\logs


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2022/01/12     20:25       68290811 巨大ファイル.log

サーバのログの監視などでしょっちゅう状態を知りたいときなどに、
Linuxのtailの代わりにこれをやると

date
Get-Content \\リモートのPC\巨大ファイル -tail 20
date
20221013日 木曜日 20:23:29
~略~
20221013日 木曜日 20:26:03

2分半くらいかかった。もっと素早くぱぱっと見たい。

FileStreamのSeekを使ってから、StreamReaderに引き渡す。
byte数指定なので、仮に10000byte

using namespace System.IO
using namespace System.Text
date
$infile="\\リモートのPC\巨大ファイル" 
$fs = [FileStream]::new($infile, [FileMode]::Open, [FileAccess]::Read, [FileShare]::ReadWrite) #Seek()を使いたい + FileShare指定したいのでこれで開く
$fs.Seek(-10000, [SeekOrigin]::End)
$st = [StreamReader]::new($fs, [Encoding]::GetEncoding("shift_jis")) #ReadToEnd(), ReadLine()などを使いたいので
$st.ReadToEnd()
$st.close()
$fs.close()
date
20221013日 木曜日 20:22:00
~略~
20221013日 木曜日 20:22:14

14秒。
[FileShare]::ReadWrite でサーバ側の更新処理を邪魔しないようにしている(はず)