在写入一些内容到某个日志文件中,在另一个进程/线程中要读取文件内容的时候报异常,提示 System.IO.IOException: 文件“xxxxxx”正由另一进程使用,因此该进程无法访问此文件。
FileShare 枚举:
包含用于控制其他 FileStream 对象对同一文件可以具有的访问类型的常数。
使用FileShare.ReadWrite属性可解决多线程时,写入日志报异常问题。
Log.cs
using Newtonsoft.Json;
using System;
using System.IO;
using System.Text;
namespace Test
{
public class Log
{
private static string log_dir = AppDomain.CurrentDomain.BaseDirectory + "LOG";
private static string warn_dir = AppDomain.CurrentDomain.BaseDirectory + "WARN_LOG";
private static string log_path
{
get
{
if (!Directory.Exists(log_dir))
{
Directory.CreateDirectory(log_dir);
}
if (!Directory.Exists(warn_dir))
{
Directory.CreateDirectory(warn_dir);
}
return DateTime.Now.ToString("yyyyMMddHH");
}
}
private static string warn_path { get { return warn_dir + "\\" + log_path + ".txt"; } }
private static string path { get { return log_dir + "\\" + log_path + ".txt"; } }
public static void write_log(string str)
{
string strlog = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": " + str + "\r\n";
using (FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.Write(strlog);
sw.Flush();
sw.Close();
fs.Close();
}
}
// File.AppendAllText(path, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": " + str + "\r\n");
}
public static void write_warn_log(string str)
{
string strlog = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": " + str + "\r\n";
using (FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.Write(strlog);
sw.Flush();
sw.Close();
fs.Close();
}
}
// File.AppendAllText(warn_path, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": " + str + "\r\n");
}
public static void write_json(string title,string json)
{
try
{
JsonSerializer serializer = new JsonSerializer();
JsonTextReader jtr = new JsonTextReader(new StringReader(json));
object obj = serializer.Deserialize(jtr);
if (obj != null)
{
StringWriter textWriter = new StringWriter();
JsonTextWriter jsonWriter = new JsonTextWriter(textWriter)
{
Formatting = Formatting.Indented,
Indentation = 4,//缩进字符数
IndentChar = ' '//缩进字符
};
serializer.Serialize(jsonWriter, obj);
Log.write_log(title + textWriter.ToString());
}
}
catch (Exception ex)
{
Log.write_log(title + ", 错误的JSON:" + ex.Message);
}
}
}
}
调用:
Log.write_log("");
Log.write_warn_log("");
Log.write_json("");