• .NET对IO的基本操作集合


    分享一下对IO的基本使用,很简单的东西,不需要记住,用的时候看一下就可以了。

    个人对IO的使用很少,记录日志,保存一些数据,保存文件,其他的基本上很少用到,做商城类的项目应该会用到很多

    1.先配置一下文件路径,这里一般都把路径的地址放在配置文件里面(config文件),方便维护

    //AppConfig
     <appSettings>
        <add key="LogPath" value="路径自己配置"/>
        <add key="LogMovePath" value="路径自己配置"/>
      </appSettings>

    2.在代码中获取config中的路径地址

         /// <summary>
            /// 配置绝对路径
            /// </summary>
            private static string LogPath = ConfigurationManager.AppSettings["LogPath"];
            private static string LogMovePath = ConfigurationManager.AppSettings["LogMovePath"];
            /// <summary>
            /// 获取当前程序路径
            /// </summary>
            private static string LogPath2 = AppDomain.CurrentDomain.BaseDirectory;

    3.下面正式开始对IO的操作

    检查路径是否存在,这里要注意一下,如果路径不存在,也不会报错,所以这里的验证是很有必要。

     //检查路径是否存在
      if (!Directory.Exists(LogPath))
       {
          //不存在则创建,一次性创建所有子文件夹
          Directory.CreateDirectory(LogPath);
       }

    对文件夹的一些基本操作(增删改查),微软是很优雅的语言,给它一个路径,他会帮我们把整个路径都完整的创建出来,不需要考虑其他的,哪怕你给的路径只有根目录,子目录都会帮你创建好

    //创建文件夹
    Directory.CreateDirectory(LogPath);
    //移动文件夹
    Directory.Move(LogPath, LogMovePath);
    //删除文件夹
    Directory.Delete(LogMovePath);

    路径存在了,定位到了路径下的文件夹,这时候需要获取一些文件夹信息的数据(这里路径不存在也不会报错,会返回一个虚假的文件夹信息,具体的可以自己测试一下)

    这里是放了一些基本的东西,还有很多东西,大家可以自己去看一下

    //用来描述具体的文件夹
    DirectoryInfo info = new DirectoryInfo(LogPath);//不存在也不报错
    //info.FullName,获取完整路径
    //info.CreationTime,获取创建时间
    //info.LastWriteTime,获取上次修改时间
    //info.GetFiles().Lengt,获取当前文件夹下文件的数量
    Console.WriteLine($"{info.FullName},{info.CreationTime},{info.LastWriteTime}{info.GetFiles().Length}");

    文件夹找到了,下面检查一下文件夹下的文件是否存在

     //检查文件是否存在
    if (!File.Exists(Path.Combine(LogPath, "111.txt")))
    {
    //不存在操作
    }

    获取文件的基本信息,方法基本上跟文件夹的一样,区别不大

    //用来描述具体文件
    FileInfo fileinfo = new FileInfo(Path.Combine(LogPath, "111.txt"));
    Console.WriteLine($"{fileinfo.FullName},{fileinfo.CreationTime},{info.LastWriteTime}");

    将两个字符串合并成一个路径(路径+文件名),使用Path.Combine,这个方法会自动将两个合并成一个完整路径

    string fileName = Path.Combine(LogPath, "log.txt");
    string fileNameCopy = Path.Combine(LogPath, "logCopy.txt");
    string fileNameMove = Path.Combine(LogPath, "logMove.txt");

    将指定数据写如到文件中(这里以前有用这个来记录日志),下面使用了4种方式来对文件写入数据,使用哪个,就看自己的喜好了

    //打开文件流(创建文件并写入)
      using (FileStream fileStream = File.Create(LogPath))
     {
        string name = "123456677";
        byte[] bytes = Encoding.Default.GetBytes(name);
        //写入文件流
        fileStream.Write(bytes, 0, bytes.Length);
        //清空缓存区,不清空文件没用数据
        fileStream.Flush();
    }
    //打开文件流(创建文件并写入),跟上面的写法区别不大
    using (FileStream fileStream = File.Create(LogPath))
    {
        StreamWriter sw = new StreamWriter(LogPath);
        sw.WriteLine("1234567890");
        sw.Flush();
    }
    //流写入器(创建/打开文件并写入),追加操作
    using (StreamWriter sw = File.AppendText(LogPath))
    {
        string msg = "今天是个好天气";
        sw.WriteLine(msg);
        sw.Flush();
    }
    //流写入器(创建/打开文件并写入),追加操作
    using (StreamWriter sw = File.AppendText(LogPath))
    {
        string msg = "今天是个好天气";
        byte[] bytes = Encoding.Default.GetBytes(msg);
        sw.WriteLine(bytes);
        sw.Flush();
    }

    读取指定文件中的数据,一种分行读取,一种全部读取,返回的数据格式都是String类型

     //读取文件内容,分行读取
    foreach (string result in File.ReadAllLines(LogPath))
    {
        //输出每一行
        Console.WriteLine(result);
    }
    //读取全部
    string sResult = File.ReadAllText(LogPath);
    Byte[] byteContent = File.ReadAllBytes(LogPath);
    string sResultContent = Encoding.UTF8.GetString(byteContent);

    如果文件太大怎么办?经常有人遇到过,一个文件好几个G,甚至几十个G的情况,如果是读取全部的话,会直接卡死的,下面给出一种最简单的方法

    //分批读取文件
    using(FileStream stream = File.OpenRead(LogPath))
    {
        //每次读取的长度,根据实际需求做调整
        int length = 5;
        //成功读取的长度
        int result = 0;
        do
        {
            //每次读取的数据容器
            byte[] bytes = new byte[length];
            //将数据读取并存放到数据容器中,返回成功读取的长度
            result = stream.Read(bytes, 0, 5);
            //展示成功读取的数据,实际场景根据需求来完成业务逻辑
            for (int i = 0; i < result; i++)
            {
                Console.WriteLine(bytes[i].ToString());
            }
        }
        //当成功读取的长度小于每次读取的长度,说明已经读取完了,结束循环
        while (length == result);
    }    

    大概内容就这么多,还有两个挺实用的方法,省得每次都在哪 时间轴+随机数来重命名文件名了

    //返回一个随机的文件名
    Console.WriteLine(Path.GetRandomFileName());
    //返回不带后缀名的文件名称
    Console.WriteLine(Path.GetFileNameWithoutExtension(LogPath));

    所有内容就这么多,IO这块的操作很简单,也不需要去记住,用的时候查一下就好了

  • 相关阅读:
    <<剪绳子>>题解
    P5743 小猴吃桃 题解
    注意C++中的int与long long 的乘法
    数组初始化方法总结
    一维差分和二维差分
    一维前缀和与二维前缀和
    例2-6 字母转换
    例1-11 评测机队列
    golang ---查找字串实例 IP address
    mongodb ---加减等操作
  • 原文地址:https://www.cnblogs.com/liuqiwang/p/8306055.html
Copyright © 2020-2023  润新知