嘗試實現一個自定義的尾狀函數,在檢查了幾個例子之後,我已經到了下面的代碼,這很好地工作(不加載整個文件來讀取X結束行,適用於網絡路徑...)如何使用流讀取器獲取X行
我現在的問題是我不知道如何移動流指針說10行之前它的當前位置?
作爲一種解決方法,我將指針移動到當前位置前的1024個字節,但我不知道這實際上涉及多少行。
$sr=New-Object System.IO.StreamReader($fs)
$lastPosition=$sr.BaseStream.Length # final position of the file
$currentPosition=$lastPosition - 1024
任何人都可以指點我正確的方向嗎?
下面是完整的代碼:
function tail{
[cmdletBinding()]
Param(
[Parameter(Position=0, Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[System.String]
$filename, # path
[int]$n=10, # number of lines to output
[switch]$continous, # continue to monitor for changes ?
[switch]$hilight # hilight lines containing keywords ?
)
# Initialising stuff
[email protected]("erreur","error","fatal","critic")
[email protected]("attention","warning","notice")
$errorColor="red"
$warningColor="darkyellow"
if ((test-Path $filename) -eq $false){
write-Error "Cant read this file !"
exit
}
function tailFile($ptr){
# return each line from the pointer position to the end of file
$sr.BaseStream.Seek($ptr,"Begin")
$line = $sr.ReadLine()
while ($line -ne $null){
$e=$w=$false
if($hilight){
$hilightError | %{ $e = $e -or ($line -match $_) } # find error keywords ?
if($e) {wh $line -ForegroundColor $errorColor }
else{
$hilightWarning | %{ $w = $w -or ($line -match $_) } # find warning keywords ?
if($w){ wh $line -ForegroundColor $warningColor }
else{ wh $line}
}
}
else{ #no hilight
wh $line
}
$line = $sr.ReadLine()
}
}
# Main
$fs=New-Object System.IO.FileStream ($filename,"OpenOrCreate", "Read", "ReadWrite",8,"None") # use ReadWrite sharing permission to not lock the file
$sr=New-Object System.IO.StreamReader($fs)
$lastPosition=$sr.BaseStream.Length # final position of the file
$currentPosition=$lastPosition - 1024 # take some more bytes (to get the last lines)
tailfile $currentPosition
if($continous){
while(1){
start-Sleep -s 1
# have the file changed ?
if ($sr.BaseStream.Length -eq $lastPosition){
write-verbose "no change..."
continue
}
else {
tailfile $lastPosition
$lastPosition = $sr.BaseStream.Position
write-Verbose "new position $lastPosition"
}
}
}
$sr.close()
}
我認爲你可以從這個答案爲C#採取提示:http://stackoverflow.com/a/4619770/520612 –
@Christian謝謝你,我已經有更多的工作要做:) –
你知道在V3中'get-content'有一個'-tail'參數嗎? –