我正在为我的程序创建一个日志记录机制,我必须将数据记录到一个文件中,该文件的位置和名称由用户指定。
我正在使用流编写器进行日志记录,如下所示 -
StreamWriter writer = Writer ?? File.AppendText(FileName);
writer.WriteLine(DateTime.Now + " " + text);
writer.Flush();
writer.Close();
但是如果用户在我的程序运行时打开文件,则在用户关闭并重新打开文件之前,用户看不到新记录的行,他们是否可以克服此行为,用户也可以看到文件打开时新记录的行。
答案 0 :(得分:1)
使用FindWindow和sendmessage找到一个解决方案,以下是相同的代码 -
[DllImport("user32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lp1, string lp2);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, [In] string lpClassName, [In] string lpWindowName);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
extern static int SendMessageGetTextLength(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);
// Writes text line into log file.
// If the log file is opened with notepad, it is pasted there instead
static public void Log(string inputText, DateTime startTime = new DateTime())
{
try
{
/* DateTime now = DateTime.Now;
inputText = now.ToString() + " " + inputText;
if (startTime != new DateTime())
{
double diffTime = (int)(now - startTime).TotalMilliseconds;
String t;
if (diffTime >= 10000)
t = ((int) diffTime / 10000).ToString() + " s";
else
t = ((int)diffTime).ToString() + " ms";
inputText += ", " + t;
}
*/ //irrelevant to the answer
// search for log file opened with notepad
IntPtr editBox = GetNotepadWindow();
if (editBox == IntPtr.Zero)
{
// log file is not open => append line to file
try
{
var writer = new StreamWriter(LogFile, true);
writer.WriteLine(inputText);
writer.Flush();
writer.Close();
}
catch
{
}
return;
}
// paste line into notepad
int length = SendMessageGetTextLength(editBox, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero);
SendMessage(editBox, EM_SETSEL, length, length); // search end of file position
inputText += "\r\n";
SendMessage(editBox, EM_REPLACESEL, 1, inputText); // append new line
}
catch
{
}
}
static private IntPtr GetNotepadWindow()
{
string windowName = LogFile;
if (string.IsNullOrEmpty(LogFile))
windowName = "Untitled";
int index = windowName.LastIndexOf('\\');
if (index >= 0)
windowName = windowName.Substring(index+1);
IntPtr mainWindow = FindWindow("Notepad", windowName + " - Notepad");
IntPtr editBox = IntPtr.Zero;
if (mainWindow != IntPtr.Zero)
editBox = FindWindowEx(mainWindow, new IntPtr(0), "Edit", null);
return editBox;
}