我有一个c#代码,我需要在按钮点击后记录txt文件中的信息。文件被创建但write方法抛出异常错误:
写方法:
public static void writelogfile(string text)
{
StreamWriter sw = logfile.AppendText();
sw.WriteLine(text);
sw.Close();
}
文件创建方法:
string filename = "loging-" + DateTime.Now.ToString("yyyyMMdd-HHmmss") + ".txt";
logfile = new FileInfo("D:Log\\" + filename); //for QA
logfile.Create();
记录信息的方法中使用的实际行:
writelogfile("userid: " + id);
该进程无法访问文件'D:test.txt',因为它正在存在 由另一个进程使用。在System.IO .__ Error.WinIOError(Int32 System.IO.FileStream.Init(String。中的errorCode,String maybeFullPath) path,FileMode模式,FileAccess访问,Int32权限,布尔值 useRights,FileShare共享,Int32 bufferSize,FileOptions选项, SECURITY_ATTRIBUTES secAttrs,String msgPath,Boolean bFromProxy)at System.IO.FileStream..ctor(String path,FileMode mode,FileAccess 访问,FileShare共享,Int32 bufferSize,FileOptions选项,字符串 System.IO.FileStream..ctor中的msgPath,Boolean bFromProxy(String path,FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize,FileOptions options)at System.IO.StreamWriter..ctor(String path,Boolean append,Encoding System.IO.StreamWriter..ctor(String。)中的编码,Int32 bufferSize) 在System.IO.FileInfo.AppendText()处的path,Boolean append) Blocked_listupdate.VisualWebPart1.VisualWebPart1UserControl.writelogfile(字符串 文字) Blocked_listupdate.VisualWebPart1.VisualWebPart1UserControl<> C_ DisplayClass1.b _0() 在Microsoft.SharePoint.SPSecurity。<> c_ DisplayClass4.b _2()at Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode)at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback secureCode,Object param)at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode)at Blocked_listupdate.VisualWebPart1.VisualWebPart1UserControl.btnupdate_Click(对象 发件人,EventArgs e)
答案 0 :(得分:1)
你说该文件已创建,但我看不出来怎么样?给出以下一行
logfile = new FileInfo("D:Log\\" + filename); //for QA
该路径无效 - 冒号后需要反斜杠。你也可以用@作为前缀,这样你就不需要双反斜杠了。
例如:
var file = new FileInfo(@"D:\Log\Something" + filename);
此外,您的错误堆栈跟踪与发布的代码不匹配,如果您的代码是任何内容,则文件名应包含日期时间。 stacktrace显示文件名为test.txt
如果没有其他问题,更正路径应该解决此问题。
答案 1 :(得分:0)
此IOException ...
该进程无法访问文件'D:test.txt',因为它正由另一个进程使用
..正如异常所说是因为你试图使用已经锁定的文件。您可以使用ProcessExplorer的查找句柄或DLL来确定哪个进程具有锁定。
很可能ProcessExplorer会告诉你它的两件事之一
如果它的第一个答案很简单,请关闭导致问题的应用程序。
如果是第二个,怀疑是因为你的评论它有时会记录,但有时我会得到错误你有几个选择。最简单的是在写
时阻止private readonly object logLock = new object();
public static void writelogfile(string text)
{
lock(myLock)
{
//Using instead of close in case there's an error with WriteLine
using(StreamWriter sw = logfile.AppendText())
{
sw.WriteLine(text);
}
}
}
问题在于,如果发生大量日志记录的主要问题,则所有请求都必须等待日志记录。
另一种方法是在后台线程中写入文件,但要删除IO争用。例如,您将写入队列,并定期检查队列并将队列刷新到日志中。
答案 2 :(得分:0)
使用logfile.Create();
创建StreamWriter。您需要关闭流编写器(或使用它创建的编写器),否则您将遇到两个StreamWriters尝试写入同一文件的问题。
只需将logfile.Create()
更改为using( logfile.Create() ){}
即可处置新创建的StreamWriter。或者,您可以将sw
分配给Create()
方法,然后将其传递到writelogfile()
方法:StreamWriter sw = logfile.Create()