文件的IO操作..很多同行的IO工具类都是直接写..但是如果文件有只读属性的话..则会写入失败..所以附加了一个只读的判断和修改..
代码如下:
/// <summary> /// 创建文件或者附加内容 /// </summary> /// <param name="modelsStr">要写入的文本</param> /// <param name="Encoding">编码方式</param> /// <param name="filePath">文件路径(支持相对路径或绝对路径)</param> /// <param name="IsFullPath">是否是绝对路径</param> /// <param name="IsAppend">附加还是全新写入</param> /// <returns></returns> public static bool Write(string modelsStr, string encoding, string filePath, bool IsFullPath, bool IsAppend) { encoding = string.IsNullOrEmpty(encoding) ? Config.DefaultEncoding : encoding; //文件的绝对路径 web程序和winform程序的获取方法是不一样的 filePath = IsFullPath ? filePath : System.Web.HttpContext.Current == null ? System.IO.Directory.GetCurrentDirectory() + filePath : System.Web.HttpContext.Current.Server.MapPath(filePath); //获取文件对象 FileInfo File = new FileInfo(filePath); //判断文件夹是否创建 if (!File.Directory.Exists) { File.Directory.Create(); } //判断文件是否存在 if (!File.Exists) { using (File.Create()){} } else if (File.Attributes.ToString().IndexOf("ReadOnly") != -1) //判断文件属性是否只读 { File.IsReadOnly = false; //******************************************** //网上很多教程是这么写的..但是发现有问题.. // 注意: 请在复制代码后把下边这一行删掉 File.Attributes = FileAttributes.Normal; //******************************************** } try { //将内容覆盖或者追加到文件的最后 using (StreamWriter writer = new StreamWriter(File.FullName, IsAppend, Encoding.GetEncoding(encoding))) { writer.Write(modelsStr); writer.Flush(); } return true; } catch (Exception ex) { Console.Write(ex.Message); Logger.Error(ex); return false; } }
请注意中间注释的位置..
使用了
File.Attributes = FileAttributes.Normal;
之后..会有两个问题:
1. 文件如果有隐藏属性或者其他的属性..将被丢弃..也就是说不单单修改了文件的只读..也把其他的属性丢掉了..
2. 在下边的写入操作中会直接抛错..显示文件被占用..但是也不是全都会报错..Some Time 吧..
下边是猜测..别当真..说的不对的..请过路大仙指正..
用鼠标直接打开文件夹点开文件属性勾掉文件只读时..会有一段的反应时间..但是在使用上述代码的时候没有这个时间..所以我在想是不是修改了FileInfo对象后..有一段的时间给程序去修改文件夹中的文件属性..而这个操作是后台的..不会使程序停滞..导致程序的下一行创建 StreamWriter的时候直接显示文件被占用.. 猜测而已..请指正..
总之..建议在做IO的只读属性的时候..还是使用ReadOnly来的比较合适..