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. Django:序列化的几种方法

    前言 关于序列化操作,就是将一个可迭代的数据结构,通过便利的方式进行我们所需要的操作. 今天历来归纳一下,Django中的几种不同得分方法,已经Django-restframework提供的方法 创建 ...

  2. 有关_meta内容(持续更新)

    假设在models里创建了一个类:UserInfo model.UserInfo._meta.app_label #获取该类所在app的app名称 model.UserInfo._meta.model ...

  3. [转帖]新iPhone的黑科技:UWB技术揭秘

    新iPhone的黑科技:UWB技术揭秘 http://blog.nsfocus.net/iphone-black-technology-uwb-technology-revealed/    阅读:  ...

  4. tp5 关键字模糊查询 日期查询 小于大于某范围等查询的优点

    挺不错,用熟了这tp5封装的很方便. 类似上边一个查询多个操作,基本在model 一个方法搞定代码也不用很多, 首先要学会用scope  网上搜tp scope 有几个例子可以借鉴 model 内添加 ...

  5. hadoop常见问题收集

    hadoop 搭建 常用命令记录 快捷键安装在/user/local/bin目录下 nano 文件名 ctrl + k 剪切一行 ctrl + o 保存并重命名,不重命名直接enter ctrl + ...

  6. luoguP1823 [COI2007] Patrik 音乐会的等待

    题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...

  7. PB学习笔记之随笔

    1.根据条件改变字体颜色.if(curdate>=bdate and curdate<edate,rgb(255,0,0),if(sex=1, if(curdate>=mdate, ...

  8. ActiveMQ 消息队列服务

      1 ActiveMQ简介 1.1 ActiveMQ是什么 ActiveMQ是一个消息队列应用服务器(推送服务器).支持JMS规范. 1.1.1 JMS概述 全称:Java Message Serv ...

  9. php反转输出字符串(两种方法)

    //第一种方法 function fz($a){ echo strrev($a); } fz('adfjdlks'); echo '<br />';   //第二种方法 function ...

  10. shell 学习笔记8-case条件语句

    一.case语句简介 1.什么是case条件语句 case条件语句就相当于多分支的if/elif/else条件语句,但是比这样的语句更规范更好看,经常被用在失效系统服务启动脚本等企业应用中 程序将ca ...