3

5 月の C# モノタッチ アプリケーションでログを保存するために、次のコードを使用しています。

public static void  writeExeption(string message){
        string path= StorageClass .LogsPath ;
        string filepath= Path.Combine (path ,"Log.txt");
        if(!File.Exists (filepath )){
            using (StreamWriter sw = File.CreateText(filepath)) 
            {
                sw.WriteLine ("--------------------------------------------------------------------------" +
                              "--------------------");
                sw.WriteLine("blahblah...");
                sw.WriteLine ("--------------------------------------------------------------------------" +
                              "--------------------");
            }   
        }
        using (StreamWriter w = File.AppendText(filepath ))
        {
            Log(message , w);
        }
    }

    public static void Log(string logMessage, TextWriter w)
    {
        w.Write("\r\nLog Entry : ");
        w.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(),
                    DateTime.Now.ToLongDateString());
        w.WriteLine("  :");
        w.WriteLine("  :{0}", logMessage);
        w.WriteLine ("--------------------------------------------------------------------------" +
                      "--------------------");
    }

しかし、アプリケーションでは次のエラーが発生します。

 Sharing violation on path 'File Path'
4

2 に答える 2

1

2 つ以上の場所 (別のスレッドにある可能性があります) で 1 つのファイルにアクセスしているようです。

このようなエラーを回避するには、次のメソッドを使用してマルチスレッド アプリでファイルを読み書きします。

    /// <summary>
    /// Writes the file exclusively. No one could do anything with file while it writing
    /// </summary>
    /// <param name="path">Path.</param>
    /// <param name="data">Data.</param>
    public static void WaitFileAndWrite(string path, byte[] data)
    {
        while (true) {
            Stream fileStream = null;

            try {
                // FileShare.None is important: exclusive access during writing
                fileStream = File.Open(path, FileMode.Create, FileAccess.Write, FileShare.None);
                fileStream.Write(data, 0, data.Length);

                break;
            } catch (IOException ex) {
                Console.WriteLine (ex);
                Thread.Sleep(10);
            } finally {
                if (fileStream != null) {
                    fileStream.Close();
                }
            }
        }
    }

    /// <summary>
    /// Waits the file and read.
    /// </summary>
    /// <returns>The file and read.</returns>
    /// <param name="fileName">File name.</param>
    public static byte [] WaitFileAndRead(string fileName)
    {
        byte[] result = null;

        if (File.Exists(fileName)) {
            while (true) {
                Stream fileStream = null;

                try {
                    fileStream = File.OpenRead(fileName);
                    var length = fileStream.Length;
                    result = new byte[length];
                    fileStream.Read(result, 0, Convert.ToInt32(length));
                    break;
                } catch (IOException ex) {
                    Console.WriteLine (ex);
                    Thread.Sleep(10);
                } finally {
                    if (fileStream != null) {
                        fileStream.Close();
                    }
                }
            }
        }

        return result;
    }
}

それでも、あなたは正確であるべきです。誰かが読み取り/書き込み操作のためにファイルを開いて閉じない場合、これらのメソッドは無限に開こうとします。

于 2013-05-15T09:21:49.057 に答える