-5

ボタンをクリックした後にtxtファイルに情報を記録する必要があるac#コードがあります。ファイルは作成されますが、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 mayFullPath)at 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 (String path、FileMode mode、FileAccess access、FileShare share、Int32 bufferSize、FileOptions options)at System.IO.StreamWriter..ctor(String path、Boolean append、Encoding encoding、Int32 bufferSize)atSystem.IO.StreamWriter。。DisplayClass1.b _0()atMicrosoft.SharePoint.SPSecurity。<>c_ DisplayClass4.b _2()at Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode)at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback secureCode、Object param )Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode)at 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のFindHandleまたはDLLを使用して、どのプロセスにロックがあるかを判別できます。

ほとんどの場合、ProcessExplorerは2つのことのうちの1つを教えてくれます

  1. ログに記録しようとしているときに、ファイルユーティリティを使用してログを検査しています。
  2. そのロックを持っているあなたのアプリ。これは、複数のスレッドがログに書き込んでいることを意味します。これはSharepointでホストされているため、2つの要求がエラーをログに記録しようとした場合に発生する可能性があります。

最初の答えが非常に簡単な場合は、問題の原因となっているアプリを閉じます。

2番目の場合は、コメントが原因でログに記録されることがありますが、エラーが発生する場合があります。いくつかのオプションがあります。最も簡単なのは、書くときにブロックすることです

プライベート読み取り専用オブジェクト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); 
           }
        }
}

問題は、大量のロギングが発生しているという大きな問題がある場合、すべてのリクエストがロギングを待機する必要があることです。

もう1つのアプローチは、バックグラウンドスレッドでファイルに書き込むことですが、IOの競合を取り除くことです。たとえば、代わりにキューに書き込み、定期的にキューをチェックして、キューをログにフラッシュします。

于 2013-01-02T16:14:20.320 に答える