该进程无法访问文件'D:\ test.txt'

时间:2013-01-02 12:33:29

标签: c#

我有一个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)

3 个答案:

答案 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会告诉你它的两件事之一

  1. 当您尝试登录时,您正在使用某个文件实用程序检查日志。
  2. 它是你的应用程序,具有锁定。这意味着,不止一个线程正在写入日志。由于这是在Sharepoint中托管的,如果两个请求尝试记录错误,则会发生这种情况。
  3. 如果它的第一个答案很简单,请关闭导致问题的应用程序。

    如果是第二个,怀疑是因为你的评论它有时会记录,但有时我会得到错误你有几个选择。最简单的是在写

    时阻止

    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()