zoukankan      html  css  js  c++  java
  • 文件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来的比较合适..

  • 相关阅读:
    Apache Tomcat Ajp CVE-2020-1938漏洞复现
    关于JDK高版本下RMI、LDAP+JNDI bypass的一点笔记
    javaweb-codereview 学习记录-5
    java 动态代理机制
    关于<Java 中 RMI、JNDI、LDAP、JRMP、JMX、JMS那些事儿(上)>看后的一些总结-2
    关于<Java 中 RMI、JNDI、LDAP、JRMP、JMX、JMS那些事儿(上)>看后的一些总结-1
    javaweb-codereview 学习记录-4
    从0到1掌握某Json-TemplatesImpl链与ysoserial-jdk7u21的前因后果
    javaweb-codereview 学习记录-2
    javaweb-codereview 学习记录-1
  • 原文地址:https://www.cnblogs.com/iiwen/p/6113375.html
Copyright © 2011-2022 走看看