2012-06-24 3 views
1

Windows 8에서 F #으로 구문 분석해야하는 대용량 로그 파일이 있습니다. 새 행을 추가하여 로그 파일의 끝에 쓰는 서버가 계속 실행 중입니다. 로그 파일은 매분마다 변경 사항을 확인합니다. 전체 파일을 다시 구문 분석하는 대신 끝에 읽은 다음 새로 추가 된 행을 이전 구문 분석의 결과와 결합하는 것이 좋습니다. 더 나은 아직, 나는 파일을 변경할 때마다 콜백을 등록 할 수 있기를 원합니다. 그게 가능하니?대용량 파일 처리

+0

물론 끝 부분에 쓰는 서버를 다시 구성하는 것이 가장 이상적입니다 (서버가 log4net 또는 Trace API를 사용하는 경우 너무 열심히해서는 안됩니다.) ... –

+0

그래, 좋을거야. 불행히도 서버는 소스가없는 .exe 일뿐입니다. –

+4

[FileSystemWatcher] (http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx)를 사용하여 처리기를 트리거 할 수 있습니다. 핸들러는 마지막으로 액세스 한 오프셋 (또는 이전 파일 크기)을 기억하고, 거기에서'Seek()'하고 새로운 라인을 읽습니다. 액세스 충돌이 발생하지 않도록 파일을 올바르게 여는 데주의를 기울이십시오. 또한 서 v가 쓰기 위해 파일을 여는 f}에 따라 다 (니다. – bytebuster

답변

1

파일 스트림을 통해 Seek()이 가능합니다. 이런 식으로 뭔가 : 나는 아래로 추적 할 수 없습니다 오류 "가 다른 시저에서 사용 중이기 때문에 프로세스가 파일을 액세스 할 수 없습니다"

open System.IO 

let WatchLog directory file = 
    // Keep track of last read position 
    let lastRead = ref 0L 

    // Function that's called whenever the file changes 
    let processLog (e : FileSystemEventArgs) = 
     // Open file, and seek to the last read location 
     use fs = new FileStream(Path.Combine(directory, file), FileMode.Open, FileAccess.Read) 
     fs.Seek(!lastRead, SeekOrigin.Begin) |> ignore 

     // Read the rest of the file 
     use sr = new StreamReader(fs) 
     printfn "Reading log: %A" (sr.ReadToEnd()) 

     // Store the length so that we know how much to seek over next time 
     lastRead := fs.Length 
     () 

    // Create a FS watched to be notified when a file changes 
    let fs = new FileSystemWatcher(directory, file) 
    fs.Changed.Add(processLog) 
    fs.EnableRaisingEvents <- true 

WatchLog "M:\Coding\" "TestLog.txt" 

그러나, 어떤 이유로, 내 컴퓨터에서 나는 얻을. use 문은 범위를 벗어나면 처분해야하며 Close에 대한 명시 적 호출로도 문제가 해결되지 않습니다./

+2

다른 스레드 또는 프로세스에서이 작업을 수행하는 경우 해당 메시지가 필요합니다. . 끝에 하나 더 많은 매개 변수를 추가하십시오. ", FileMode.Open, FileAccess.Read, FileShare.ReadWrite) - 수정해야하지만 작성자도 공유해야합니다 (테스트하지 않았습니다). –