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("完成任务");