1.流的含义

流是一系列具有方向性的字节序列,比如水管中的水流,只不过现在管道中装的不是水,而是字节序列。当流是用于向外部目标比如磁盘输出数据时称为输出流,当流是用于把数据从外部目标读入程序称为输入流。

2.文件读写

写入

            string fileName = Server.MapPath("log.txt");
FileStream fs = File.Open(fileName, FileMode.OpenOrCreate,FileAccess.ReadWrite);
string strData = "Hello to you";
byte[] byteData = Encoding.UTF8.GetBytes(strData);
fs.Write(byteData, , byteData.Length);

读取

            string fileName = Server.MapPath("log.txt");
FileStream fs = File.Open(fileName, FileMode.Open,FileAccess.Read); byte[] buffer = new byte[];
int count =;
MemoryStream ms = new MemoryStream();
while ((count = fs.Read(buffer, , buffer.Length)) > )
{
ms.Write(buffer, , buffer.Length);
}
string strData= Encoding.UTF8.GetString(ms.ToArray());

注:File.Open方法不传FileAccess参数时,默认FileAcross.ReadWrite

3.StreamReader/StreamWriter流读写器

FileStream读写文件是直接对字节流进行操作的并不能对字符直接进行输入输出,使用StreamReader/StreamWriter可以方便的对字符/字符串进行操作。通常情况下都会把FileStream等其他流包装在StreamReader/StreamWriter中,因为这些类更容易对流进行处理。

3.1读写文本文件

写入

            string fileName = Server.MapPath("log.txt");
FileStream fs = File.Open(fileName, FileMode.Open,FileAccess.Read); StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("Hello to you");
sw.Write("It's now {0}", DateTime.Now.ToString());//格式化字符串 sw.Close();
fs.Close();

读取

            string fileName = Server.MapPath("log.txt");
FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs);
string lines="";
string line = sr.ReadLine();
lines += line;
while (line!=null)
{
line = sr.ReadLine();
lines += line;
}
txtContent.Text = lines;
sr.Close();
fs.Close();

注:StreamReader/StreamWriter本身不能对文件进行FileMode,FileAccess等权限控制,如果要控制需要在包装的流中进行

StreamReader读取二进制文件

            string fileName = Server.MapPath("img\\中文Begrüßung.png");
StreamReader sr = new StreamReader(File.OpenRead(fileName));
byte[] buffer = new byte[];
int count;
MemoryStream ms = new MemoryStream();
while ((count = sr.BaseStream.Read(buffer, , buffer.Length)) > )
{
ms.Write(buffer, , count);
} string fileName2 = Server.MapPath("img\\中文2.png");
FileStream fs = File.Open(fileName2, FileMode.OpenOrCreate);
ms.WriteTo(fs);
fs.Close();
sr.Close();

StreamReader读取二进制文件需要用到BaseStream,不能像读写文本文件那样,否则保存的文件不能用。

4.对象序列化为二进制数据

程序一般保存的数据都不是像一般的文本文件那样直接写入文本逐行保存的,而是以二进制数据的形式保存的,使用System.Runtime.Serialization.Formatters.Binary.BinaryFormatter可以把对象序列化为二进制数据,或者把二进制数据序列化为对象。

[Serializable]
public class Product
{
public long Id;
public string Name;
public double Price; [NonSerialized]
string Notes; public Product(long id, string name, double price, string notes)
{
this.Id = id;
this.Name = name;
this.Price = price;
this.Notes = notes;
} public override string ToString()
{
return string.Format("{0},{1},${2:F2},{3}",Id,Name ,Price ,Notes);
}
}

序列化/反序列化

            List<Product> products = new List<Product>();
products.Add(new Product(, "poky", 10.2, "pokys"));
products.Add(new Product(, "kuti", 2.34, "第四方")); //序列化对象保存到文件
string fileName = Server.MapPath("ser.txt");
FileStream fs = File.Open(fileName, FileMode.OpenOrCreate);
BinaryFormatter serializer = new BinaryFormatter();
serializer.Serialize(fs, products);
fs.Close(); //反序列化
FileStream ls = File.Open(fileName, FileMode.OpenOrCreate);
List<Product> ps = serializer.Deserialize(ls) as List<Product>;
ls.Close();

注:这里是序列化为二进制数据,所以和序列化为Json/xml是不一样的。

5.压缩/解压数据

如果要保存的数据比较大,还可以对数据进行压缩再保存,但是这里的压缩是单纯压缩数据,不是压缩文件,所以和常用的压缩解压工具是不一样的。

    public class CompressDAL
{
/// <summary>
/// 创建一个压缩文件
/// </summary>
/// <param name="fileName"></param>
/// <param name="data"></param>
public static void SaveCompressFile(string fileName, string data)
{
FileStream fs = File.Open(fileName, FileMode.Create,FileAccess.Write);
GZipStream gs = new GZipStream(fs, CompressionMode.Compress);
StreamWriter sw = new StreamWriter(gs);//向压缩流写入数据
sw.Write(data);
sw.Close();
} public static string LoadeCompressFile(string fileName)
{
FileStream fs = File.Open(fileName, FileMode.Open,FileAccess.Read);
GZipStream gs = new GZipStream(fs, CompressionMode.Decompress);
StreamReader sr = new StreamReader(gs);
string lines = sr.ReadToEnd();
return lines;
} }
 string data = "叫爸爸\n叫爸爸\n";

            string fileName = Server.MapPath("gzFile.txt");
CompressDAL.SaveCompressFile(fileName, data);
string content = CompressDAL.LoadeCompressFile(fileName);

26.C# 文件系统的更多相关文章

  1. 系统管理员都要知道的 30 个 Linux 系统监控工具

    1. top - 进程活动监控命令 top 命令会显示 Linux 的进程.它提供了一个运行中系统的实时动态视图,即实际的进程活动.默认情况下,它显示在服务器上运行的 CPU 占用率最高的任务,并且每 ...

  2. RHCSA阶段笔记

    命令终端字段含义介绍 [root@localhost ~]# 解释: root:当前登录系统用户名(root超级管理员) localhost :当前主机名 :当前用户所在目录( 为家目录) ,root ...

  3. 射频识别技术漫谈(26)——Felica的文件系统

    Felica的文件系统使用“系统\域\服务\数据块”的结构,如下图所示.通过这种结构实现对卡片非易失性存储区的使用和操作.                                     Fe ...

  4. 26、pathlib文件系统模块(了解)

    一.pathlib库官方定义 pathlib 是Python内置库,Python 文档给它的定义是 Object-oriented filesystem paths(面向对象的文件系统路径).path ...

  5. 26、linux文件系统

  6. .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

    FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...

  7. Linux学习之探索文件系统

    Linux,一起学习进步-    ls With it, we can see directory contents and determine a variety of important file ...

  8. .NET Core的文件系统[1]:读取并监控文件的变化

    ASP.NET Core 具有很多针对文件读取的应用.比如我们倾向于采用JSON文件来定义配置,所以应用就会涉及针对配置文件读取.如果用户发送一个针对物理文件的HTTP请求,应用会根据指定的路径读取目 ...

  9. .NET Core的文件系统[4]:由EmbeddedFileProvider构建的内嵌(资源)文件系统

    一个物理文件可以直接作为资源内嵌到编译生成的程序集中.借助于EmbeddedFileProvider,我们可以统一的编程方式来读取内嵌于某个程序集中的资源文件,不过在这之前我们必须知道如何将一个项目文 ...

随机推荐

  1. Java学习,从入门到放弃(一)SpringMVC+Maven+Mybits 多种数据库配置(mysql+sqlserver)AOP方式

    多数据库配置需求有两种,一种是因为项目太大,访问量太高,不得不分布多个数据库减轻访问压力,比较多的应用就是读写分离:另一种就是原本不同的两个数据库业务现在要整合到一起,甚至连数据库都不一样,一个mys ...

  2. 【C/C++开发】C语言实现函数可变参数

    函数原型: int printf(const char *format[,argument]...)        返 回 值: 成功则返回实际输出的字符数,失败返回-1.  函数说明:        ...

  3. 【GStreamer开发】GStreamer基础教程06——媒体格式和pad的Capabilities

    目标       Pad的Capabilities是一个GStreamer element的基础,因为framework大部分时间是自动处理的,所以我们几乎感觉不到它的存在.本教程比较偏向原理,介绍了 ...

  4. 推荐linux运维必备的几本书

    首先,<鸟哥的linux私房菜> 鸟哥 其次,<linux就该这么学> 刘瑞版 然后,<CentOS linux系统运维> 张祥琳版 最后,<CentOS运维 ...

  5. C#、.NET、ASP.NET之间的关系

    一.前言 这是个人的笔记,在博客园已经有不少大佬已经写过了.但我自己就想留点笔记在属于我自己的博客.所以大佬忽略就行,不喜勿碰.谢谢!!! 二.个人笔记 C# 全称(C sharp),它是微软公司发布 ...

  6. ubuntu18.04 阿里镜像源

    备份:cp /etc/apt/sources.list /etc/apt/sources.list.bak 清空source.list:echo > /etc/apt/sources.list ...

  7. [转帖]JAVA虚拟机和安卓虚拟机的区别

    作者:天光链接:https://www.zhihu.com/question/20207106/answer/14654536来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  8. Java的设计模式(5)-- 策略模式

    定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换,本模式使得算法可以独立于使用它的客户而变化.策略模式包括以下三种角色 策略(Strategy):策略是一个接口,该接口定义若干个算法标识, ...

  9. P1308(字符串类,处理字符串查找)

    题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...

  10. pb笔记之数据窗口设置操作

    1 使DataWindow列只能追加不能修改如何使DataWindow中的数据只能追加新记录而不能修改,利用 Column 的 Protect 属性可以很方便的做到这一点,方法如下:将每一列的 Pro ...