文件IO操作..修改文件的只读属性

文件的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来的比较合适..

原文地址:https://www.cnblogs.com/iiwen/p/6113375.html