文件,文件夹,文件流,日志文件写入记事本
对于文件和文件夹的操作都很简答,由于他们都有静态方法,所以使用起来很方便,下面直接贴方法吧,一看便知
一、文件操作:File类(FileInfo类是用来定义文件属性)
方 法 说 明
Copy() 将文件从源位置复制到目标位置
Create() 在指定的路径上创建文件
Delete() 删除文件
Open() 返回指定路径上的FileStream对象
Move() 将指定的文件移动到新位置。可以在新位置为文件指定不同的名称
二、文件夹操作:Directory类(DirectoryInfo使用来定义文件夹属性)
方 法 说 明
CreateDirectory() 创建具有指定路径的目录
Delete() 删除指定的目录及其中的所有文件
GetDirectories() 返回表示指定目录下的目录名的string对象数组
EnumerateDirectories() 与GetDirectories()类似,但返回IEnumerable<string>集合
GetFiles() 返回在指定目录中的文件名的string对象数组
EnumerateFiles() 与GetFiles()类似,但返回文件名的IEnumerable<string>集合
GetFileSystemEntries() 返回在指定目录中的文件和目录名的string对象数组
EnumerateFileSystemEntries() 与GetFileSystemEntries()类似,但返回文件和目录名的IEnumerable<string>集合
Move() 将指定的目录移到新位置。可以在新位置为文件夹指定一个新名称
三、下面讲最重要的部分文件流<Stream>
在众多stream中功能最全面的要数FileStream,then what is fileStream
FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的
法,但经常使用StreamReader或StreamWriter执行这些功能。这是因为FileStream类操作的是字
和字节数组,而Stream类操作的是字符数据。字符数据易于使用,但是有些操作,如随机文件访
(访问文件中间某点的数据),就必须由FileStream执行,稍后对此进行介绍。
还有几种方法可以创建FileStream对象。构造函数具有许多不同的重载版本,最简单的构造
数仅有两个参数,即文件名和FileMode枚举值。
FileStream aFile = new FileStream(filename, FileMode.<Member>);
FileMode枚举包含几个成员,指定了如何打开或创建文件。稍后介绍这些枚举成员。另一个常
用的构造函数如下:
FileStream aFile = new FileStream(filename, FileMode.<Member>, FileAccess.<Member>);
第三个参数是FileAccess枚举的一个成员,它指定了流的作用。FileAccess枚举的成员如下所示。
成 员 说 明
Read 打开文件,用于只读
Write 打开文件,用于只写
ReadWrite 打开文件,用于读写
对文件进行非FileAccess枚举成员指定的操作会导致抛出异常。此属性的作用是,基于用户的
身份验证级别改变用户对文件的访问权限。
在FileStream构造函数不使用FileAccess枚举参数的版本中,使用默认值FileAccess.ReadWrite。
FileMode枚举成员如表21-8所示。使用每个值会发生什么,取决于指定的文件名是否表示已
有的文件。注意,这个表中的项表示创建流时该流指向文件中的位置,下一节将详细讨论这个主题。
除非特别说明,否则流就指向文件的开头。
Append 打开文件,流指向文件的末尾。只能与枚举
FileAccess.Write 结合使用 创建一个新文件。只能与枚举
FileAccess.Write 结合使用
Create 删除该文件,然后创建新文件 创建新文件
CreateNew 抛出异常 创建新文件
Open 打开现有的文件,流指向文件开头 抛出异常
OpenOrCreate 打开文件,流指向文件开头 创建新文件
Truncate 打开现有文件,清除其内容,流指向文件开头,保留文件的初始创建日期抛出异常
FileStream使用的方法有很多,如:Seek,peek,read等等下面举例分别说明:
Example1: 结合StreamReader,StreamWriter读取文件夹,写文件(read,readline,readblock,readtoend)
private static void fileStreamTest() { string filePath = "../../sss.cs"; char[] charArray = new char[20]; byte[] byteArray = new byte[20]; Console.WriteLine("<----------------addWord--------------------------------->"); string addString = "abcdefg"; using (FileStream stream2 = new FileStream(filePath, FileMode.Append, FileAccess.Write)) { StreamWriter write = new StreamWriter(stream2); write.WriteLine(addString); write.Flush(); Console.WriteLine("success!"); } Console.WriteLine("<----------------ReadWord--------------------------------->"); using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { using (StreamReader reader = new StreamReader(stream)) { Console.WriteLine(reader.ReadToEnd().ToString()); } } Console.WriteLine("<----------------Read(decoding)--------------------------------->"); using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { using (StreamReader reader = new StreamReader(stream)) { reader.Read(charArray, 0, 20); string content = string.Empty; foreach (int i in charArray) content += (char)i; Console.WriteLine(content); } } Console.WriteLine("<----------------ReadBlockWord--------------------------------->"); using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { using (StreamReader reader = new StreamReader(stream)) { reader.ReadBlock(charArray, 0, 20); string content = string.Empty; foreach (int i in charArray) content += (char)i; Console.WriteLine(content); } } Console.WriteLine("<----------------SeekWord--------------------------------->"); using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { Console.WriteLine("positon now is:" + (int)stream.Position); stream.Seek(1000, SeekOrigin.Current); Console.WriteLine("positon changed:" + stream.Position); StreamReader reader = new StreamReader(stream); Console.WriteLine("left word afer seek" + reader.ReadToEnd()); } }
Example2:txt文件中是有用逗号分开的类似excel数据的操作
public void Text() { try { // List<String> head = new List<string>(); string[] stringArray=new string[3]; string[] bodyArray = new string[3]; List<Dictionary<string, string>> listContent = new List<Dictionary<string, string>>(); FileStream stream = new FileStream("../../file.txt",FileMode.Open,FileAccess.Read); StreamReader reader = new StreamReader(stream); stringArray=reader.ReadLine().Split(','); while (reader.Peek()!=-1) { string line = reader.ReadLine(); bodyArray = line.Split(','); Dictionary<string, string> dic = new Dictionary<string, string>(); for(int i=0;i<3;i++) { dic.Add(stringArray[i].ToString(), bodyArray[i].ToString()); } listContent.Add(dic); } foreach(string item in stringArray) { Console.Write("{0,-10}",item); } Console.WriteLine(); // Dictionary<string, string> diction = new Dictionary<string, string>(); foreach (var diction in listContent) { Dictionary<string, string> item=( Dictionary<string, string>)diction; foreach (var i in item) { Console.Write("{0,-10}",i.Value); //Console.WriteLine(); } Console.WriteLine(); } } catch { } Console.ReadKey(); }
课本上的方法:
public void UsingFunctionGetData() { //取得函数返回的数据 List<string> listHead=new List<string> (); List<Dictionary<string, string>> data = GetData(out listHead); foreach (var item in listHead) { Console.Write("{0,-10}",item); } Console.WriteLine(); foreach (Dictionary<string,string> item in data) { //foreach (var single in item) //{ // Console.Write("{0,-10}",single.Value); //} foreach (string singel in listHead) { Console.Write("{0:-10}",item[singel]); } Console.WriteLine(); } Console.WriteLine(); Console.ReadKey(); } private List<Dictionary<string, string>> GetData(out List<string> colums) { using(FileStream stream=new FileStream ("../../file.txt",FileMode.Open,FileAccess.Read)) { using(StreamReader reader=new StreamReader (stream)) { string head = string.Empty; //文件头部信息 string[] stringArray = null; char[] splitCharArray = new char[] { ','}; //分割符号集合 colums =new List<string>(); head=reader.ReadLine(); //获取第一行 stringArray = head.Split(splitCharArray); //getUpperBound 获取stringArray维度的上限(不懂) for (int i = 0; i <= stringArray.GetUpperBound(0); i++) { colums.Add(stringArray[i]); //获取返回的头部信息 } //声明返回数据的List类型 List<Dictionary<string, string>> data = new List<Dictionary<string, string>>(); string nextLine = string.Empty; //当下一行非空时 while (reader.Peek() != -1) { nextLine = reader.ReadLine(); stringArray = nextLine.Split(splitCharArray); //声明单个字典对象 Dictionary<string, string> singleDic = new Dictionary<string, string>(); for(int j=0;j<=stringArray.GetUpperBound(0);j++) { singleDic.Add(colums[j], stringArray[j]); } data.Add(singleDic); } return data; } } }
最后用一个比较综合的例子结尾:我们平时在做系统时要写日志文件,有时我们直接将文件写道txt文件中.(因为是学习,例子有点乱,我尽量多写点注释,解释我的意图)
class DerectoryTest { public void CreateDrecotory() { try {//创建文件夹 if (!Directory.Exists("../../newDirectory1")) { Console.WriteLine("not exit!"); Directory.CreateDirectory("../../newDirectory1"); Console.Write("create sucess"); } else Console.WriteLine("directory exit"); } catch(IOException e) { Console.Write("something wrong in your code!"); } Console.ReadKey(); } public void WriteLog() { try { string day = DateTime.Now.ToString("yyyy-MM") ; //文件夹名 string logName = DateTime.Now.ToString("yyyy-MM-dd")+".txt"; //日志文件名,以天为一个文件 //create a directory named by day if (!Directory.Exists(day)) //创建日志文件夹(以月为一个文件夹) Directory.CreateDirectory("../../"+day); //创建一个FileStream对象(这步来看当前文件是否有数据) using (FileStream fs = new FileStream("../../"+day+"/"+logName, FileMode.Open, FileAccess.ReadWrite)) { using (StreamReader reader = new StreamReader(fs)) { string contents = reader.ReadToEnd(); Console.WriteLine(contents); } } //写文件(test)往下看 using (FileStream fs = new FileStream("../../" + day + "/" + logName, FileMode.Append, FileAccess.Write)) { using (StreamWriter writer = new StreamWriter(fs)) { string content = string.Empty; content += "------------------" + DateTime.Now.ToString() + "-------------------------\n"; content += "nice to meet you ,welcome visited this directory and write \n"; content += "good luck \n"; writer.Write(content); } } } catch(IOException e) { Console.WriteLine(e.InnerException+"\n"+e.Message); } Console.ReadKey(); } public void DeleteDirectoryOrFile() { //删除一个文件一个文件夹 try { Directory.Delete("../../newDirectory1"); File.Delete("../../2013-07log.txt"); } //如果有错报错,并写入日志文件 catch(IOException e) { using (FileStream fs = new FileStream("../../2013-07/2013-07-24.txt", FileMode.Append, FileAccess.Write)) { using (StreamWriter writer = new StreamWriter(fs)) { string content = "-----------------"+DateTime.Now.ToString()+"---------------------\n\r"; content += "\n\r"; content+=e.InnerException+"\n\r"+e.Message+"\n\r"+e.StackTrace+"\n\r"; content += "\n\r"; //换行符 writer.Write(content); Console.WriteLine("error"); } } } Console.ReadKey(); } }