1,文件与文件夹的读取(针对Windows )
这是程序员的基本功。
做这种操作首先要引入一个命名空间
using System.IO
I input 输入
O output 输出File.Create("C:\1.txt");
file是个静态类,里面有很多方法,多是基于面向对象而设计的,所以单词好,f12进入代码,自己用。
//上面的创建是不行的对于Windows10,因为安全文件是不随便写入系统硬盘的。
//如果强行写入改变安全权限,但这么做没什么意义。
//可以创建一个文件夹,安全权限改成完全控制。Directory 目录文件夹//这是f盘Youkumoive下所有文件夹string[] a = Directory.GetDirectories(@"F:\Youkumoive", "*", SearchOption.AllDirectories);//Directory 目录以字符串数组返回盘符的路径foreach (var item in a){Console.WriteLine(item);}//F:\classic moive下的文件,只是这个目录下的string[] files = Directory.GetFiles(@"F:\classic moive");foreach (var item in files){Console.WriteLine(item);}//directory 的升级版 directoryinfo,可以得到文件或文件夹的更多信息//普通类DirectoryInfo dir = new DirectoryInfo(@"F:\classic moive");FileInfo[] files1 = dir.GetFiles();foreach (var item in files1){Console.WriteLine(item.Name);//只得到该文件夹下的文件名}DirectoryInfo[] info = dir.GetDirectories();//得到文件夹的信息
2,文件的读取与写入
//创建文件流,没有就创建一个文件,有则打开文件FileStream fs = new FileStream(@"E:\Txt\1.txt", FileMode.OpenOrCreate);//写入文件的工具StreamWriter sw = new StreamWriter(fs);sw.WriteLine("Hello World!");sw.Close();fs.Close();//读取文件StreamReader sr = new StreamReader(@"E:\Txt\1.txt");//批量读取文件string str = sr.ReadToEnd();sr.Close();fs.Close();Console.WriteLine(str);string path = @"E:\Txt\work.txt";FileStream fs1 = new FileStream(path, FileMode.OpenOrCreate);StreamReader sr1 = new StreamReader(fs1);//逐行读取string str1;while (!sr1.EndOfStream){str1 = sr1.ReadLine();Console.WriteLine(str1);}fs1.Close();
3,二进制文件的写入和读取
类:
[Serializable]//必须在类前声明这个类是可序列化的class Pet{public string name, sex, age;public Pet(){ }public Pet(string name,string sex,string age){this.name = name;this.sex = sex;this.age = age;}}
序列化如下:
string path = @"E:\Txt\2019 9 20\csdn.border"; FileStream fs = new FileStream(path,FileMode.OpenOrCreate);//new一个二进制序列化器BinaryFormatter bf = new BinaryFormatter();//把这个类进行序列化,来写入硬盘Pet p = new Pet("小猪","公","2");bf.Serialize(fs,p);//关流 fs.Close();
反序化如下
string path = @"E:\Txt\2019 9 20\csdn.border"; //读取这个对象的字段FileStream fs = new FileStream(path,FileMode.OpenOrCreate);BinaryFormatter bf = new BinaryFormatter();//反序列化,返回object类型,所以要转型为pet类Pet p = bf.Deserialize(fs) as Pet;fs.Close();//打印写入硬盘里类的字段Console.WriteLine(p.name + p.sex + p.age);//结果:小猪公2
Conclusion:
序列化的优点:可以把类,或者集合,快速的写入硬盘,不像文本文档xier
要拘泥于格式,和很多代码。
缺点:没有可读性。
作用:把硬盘和泛型集合完美的结合。
注意点:不能对二进制文件做任何的改变,否则计算机识别不了。
.Net 中读取和写入.Xml文件
.Xml 是大多数公司和程序员所承认的小范围的通信协议。其它还有json,文本操作等等。
如html则输入全球标准的通信协议。
.Xml 即一个公司和一个公司协议,以什么形式写入,以什么形式解析文件。
Using System.Xml;XmlDocument doc = new XmlDocument();string path = @"E:\Txt\2019 9 23\users.xml";
//判断是否存在子节点
if (doc.ChildNodes[0].HasChildNodes)
{}
//以下是一个三层结构的.xml文件。//创建xml文件XmlNode node = doc.CreateElement("UserInfo");//根节点userinfodoc.AppendChild(node);//其余节点XmlNode User = doc.CreateElement("User");XmlNode Uid = doc.CreateElement("Uid");XmlNode Name = doc.CreateElement("Name");XmlNode Pwd = doc.CreateElement("Pwd");XmlNode Age = doc.CreateElement("age");XmlNode Remark = doc.CreateElement("Remark");Uid.InnerText = "001";Name.InnerText = "Admin";Pwd.InnerText = "123";Age.InnerText = "20";Remark.InnerText = "我是一个管理员";//user下的子节点User.AppendChild(Uid);User.AppendChild(Name);User.AppendChild(Pwd);User.AppendChild(Age);User.AppendChild(Remark);//根节点下的子节点node.AppendChild(User);doc.Save(path);//解析for (int i = 0; i < doc.ChildNodes[0].ChildNodes.Count; i++){//删除一个节点(根节点下的子节点)doc.ChildNodes[0].RemoveChild(ChildNodes[0].ChildNodes[i]);//就是删除一个remark
//打印001 Console.WriteLine(doc.ChildNodes[0].ChildNodes[i].ChildNodes[0].InnerText);
//三个nodes 。最后一个nodes,这个是灵活多变的。但是层数不要太多,不方便读取
//子节点追加在哪里,决定该节点的父子关系。
//xml有且只有一个根节点。即上面的userinfo有且只有一个。}