-5

我有 ac# 代码,我需要在单击按钮后将信息记录在 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 errorCode, String maybeFullPath) 在 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs , String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize) at System.IO.StreamWriter.. (String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)DisplayClass1.b _0() 在 Microsoft.SharePoint.SPSecurity.<>c_ DisplayClass4.b _2() 在 Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode) 在 Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback secureCode, Object param ) 在 Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode) 在 Blocked_listupdate.VisualWebPart1.VisualWebPart1UserControl.btnupdate_Click(Object sender, EventArgs e)

4

3 回答 3

1

您说文件已创建,但我不明白如何创建?鉴于以下行

logfile = new FileInfo("D:Log\\" + filename); //for QA 

该路径无效 - 冒号后需要有一个反斜杠。如果愿意,您也可以使用 @ 前缀,这样就不需要双反斜杠。

例如:

var file = new FileInfo(@"D:\Log\Something" + filename);

此外,您的错误堆栈跟踪与发布的代码不匹配,如果您的代码可以通过,文件名中应该有一个日期时间。堆栈跟踪显示该文件具有名称test.txt

如果没有其他问题,更正路径应该可以解决问题。

于 2013-01-02T13:40:21.030 回答
0

这个 IOException...

该进程无法访问文件“D:test.txt”,因为它正被另一个进程使用

..is 正如例外所说,是因为您尝试使用已经有锁的文件。您可以使用ProcessExplorer的 Find Handle 或 DLL来确定哪个进程拥有锁。

ProcessExplorer 很可能会告诉您它的两件事之一

  1. 您在尝试登录时正在使用一些文件实用程序检查日志。
  2. 它是你的应用程序有锁。这意味着,有多个线程正在写入日志。由于它托管在 Sharepoint 中,因此如果两个请求尝试记录错误,则可能会发生这种情况。

如果它是第一个答案很简单,请关闭导致问题的应用程序。

如果是第二个,怀疑是因为您的评论有时会记录,但有时我会收到错误消息,您有几个选择。最简单的就是在写的时候阻塞

私有只读对象 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 争用。例如,您改为写入队列并定期检查队列并将队列刷新到日志。

于 2013-01-02T16:14:20.320 回答
0

通过使用logfile.Create();StreamWriter 创建。您需要关闭流写入器(或使用它创建的写入器),否则您将遇到两个 StreamWriters 尝试写入同一个文件的问题。

只需更改logfile.Create()using( logfile.Create() ){}并且应该处理新创建的 StreamWriter。或者,您可以分配sw给该Create()方法,然后将其传递给该writelogfile()方法:StreamWriter sw = logfile.Create()

于 2017-03-07T16:38:48.397 回答