Сброс журнала на диск, исключение в VerifyOSHandlePosition - PullRequest
1 голос
/ 08 февраля 2012

Как мне записать файл журнала из службы C #, чтобы он своевременно записывался на диск?

Вот что я пробовал.В журнале регистрации я открыл файл, подобный этому:

var file = return File.Open(name, FileMode.Append, 
                            FileAccess.Write, FileShare.Read);
var writer = new StreamWriter(file);

, и записал в него следующее:

writer.WriteLine(msg);
writer.Flush();
file.Flush();

Однако журнал не был своевременно записан на диск.Поэтому я попытался добавить 5-секундный таймер, который делает это:

[DllImport("kernel32.dll")]
static extern bool FlushFileBuffers(IntPtr hFile);

file.Flush();
var hdl = file.SafeFileHandle;
FlushFileBuffers(hdl.DangerousGetHandle());

Это работает, но через нечастые интервалы я получаю следующее исключение:

System.IO.IOException: The OS handle's position is not what FileStream expected. Do not use a handle simultaneously in one FileStream and in Win32 code or another FileStream. This may cause data loss.

at System.IO.FileStream.VerifyOSHandlePosition()

Есть ли лучшеспособ заставить флеш?

1 Ответ

0 голосов
/ 08 февраля 2012

За этот ответ , в .NET 4.0 достаточно просто позвонить

file.Flush(true)

Больше не нужно возиться с вызовом p / Invoke.

...