5-文件操作

本篇博客对应视频讲解

文件系统

不管是什么操作系统,文件系统都是基本的组成部分。 通过目录和文件,我们可以组织、存储和查找我们的文件,不同的文件类型,我们可以通过不同的软件进行读写操作。 可以说,我们使用计算机,相当一部分时间都是在处理不同的文件。文件系统是表示计算机存储设备(内存和磁盘)内容的抽象概念。 以文件的形式呈现给人类。

我们将满足特定数据格式的存储到磁盘。文件系统会通过文件路径和名称来维护这些存储内容。 所以,我们进行文件操作,实质上就是对不同编码的字符串进行操作。在多数时候,为了避免在编码问题上花费时间,我们通常会使用UTF-8格式。

只要我们能够知道文件是以什么编码方式存储的,我们就可用这种规则去读取和编辑。

文件操作

关于文件操作及I/O流较完整的内容,请务必浏览 官方文档:文件和流 I/O

下面我们将通过一个实例来讲解文件相关的操作。

实际场景:

今天我使用手机拍了很多照片,现在我想把这些照片进行压缩生成新的图片,按照一定的规则命名存储起来。 我们将处理结果输出到一个文本文件。

分析:

  • 首先我们要明确的是,我们是需要对多个文件进行操作,这样才值得我们自己写程序去实现。如果只是一张的话,我们通过软件操作就可以了。所以这里需要解决第一个问题就是 获取某个目录下所有图片的信息

  • 通过相机拍摄的照片通常都很大,所以,我们要将这些照片压缩。 这里就是第二个问题 如何压缩图片。 由于.net core还没有对System.Drawing有很好的支持。这里我们使用第三方类库ImageSharp来实现该功能。也是利用.net 开源生态的力量。

  • 压缩之后,我们要将新的图片以特定的命名方式存储。那么第三个问题就是 如何将一个图片指定名称存储到指定位置

  • 存储完之后,我们要将处理记录输出到文件。这是最后一步 输出内容到文件

根据以上的思路,我们来实现代码:

           //1 获取目录下所有文件信息
            var dirs = new DirectoryInfo(@"e:\images");//原目录
            var outDirs = Directory.CreateDirectory(@"e:\images\output");//输出目录
            var files = dirs.GetFiles("*.*");

            var outputInfo = "";//记录转化内容

            //2 遍历文件,压缩转化输出 
            int i = 1;
            foreach (var file in files)
            {
                //读入图片文件
                using (var img = Image.Load(file.FullName))
                {
                    //设置输出选项
                    Configuration.Default.SetEncoder(ImageFormats.Jpeg, new JpegEncoder()
                    {
                        Quality = 85,
                        IgnoreMetadata = true,
                    });
                    var newImg = img.Clone(ctx => ctx.Resize(new ResizeOptions
                    {
                        Size = new Size((int)(img.Width / 1.5), (int)(img.Height / 1.5)),
                        Mode = ResizeMode.BoxPad
                    }));

                    //构造新文件名称
                    var fileName = Path.Combine(outDirs.FullName, DateTime.Now.ToString("MMdd") + $"-myphotos{i}.jpg");
                    //保存副本到新文件
                    newImg.Save(fileName);
                    i++;
                    outputInfo += $"原文件:{file.FullName} => 新文件:{fileName}\r\n";
                    Console.WriteLine(outputInfo);
                }
            }
            //生成操作记录
            File.WriteAllText(@"e:\images\output.txt", outputInfo);
            Console.WriteLine("完成任务");
posted @ 2018-10-11 17:26  TypingLearn  阅读(221)  评论(2编辑  收藏  举报