第19章 文件及I/O
来源:互联网 发布:手机淘宝通知提醒在哪 编辑:程序博客网 时间:2024/06/14 23:15
c#中与文件、文件夹及文件读写有关的类位于System.IO命名空间下
一、 文件操作基础
1 File类和FileInfo类介绍
File类中的方法是静态方法
(1)File实例
if (textBox1.Text == string.Empty)
{
MessageBox.Show("文件名不能为空!");
}
else
{
if (File.Exists(textBox1.Text)) //File.Exists判断文件是否存在
{
MessageBox.Show("该文件已经存在!");
}
else
{
File.Create(textBox1.Text); //File.Create创建文件
}
}
//通过File.Create()得 到FileStream对象 using(FileStream fs=File.Create(@"c:\test.dat")) {} //通过File.Open()得到 FileStream对象 using(FileStream f2=File.Open(@"c:\test.dat",FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None)) {} //得到一个只读权限的的 FileStream对象 using(FileStream readOnlyStream=File.OpenRead(@"c:\test.dat")) {} //得到一个只写权限的的 FileStream对象 using(FileStream writeOnlyStream=File.OpenWrite(@"c:\test.dat")) {} //得到 StreamReader对象 using(StreamReader sreader=File.OpenText(@"c:\test.dat")) {} //得到 StreamWriter对象 using(StreamWriter sreader=File.CreateText(@"c:\test.dat")) {} using(StreamWriter sreader=File.AppendText(@"c:\test.dat")) {}
File 类型的其他方法简化读写文本数据的过程。
string[] myTasks={"AAA","BBB","CCC"}; //向c盘文件写入数据 File.WriteAllLines(@"c:\task.txt",myTasks); //重新读取数据,然后输出 foreach(string task in File.ReadAllLines(@"c:\task.txt")) { Console.WriteLine("TODO:{0}",task); } Console.ReadLine();
File.WriteAllLines 写入字符串数组,如果文件不存在,则创建文件
(2)FileInfo实例
if (textBox1.Text == string.Empty)
{
MessageBox.Show("文件名不能为空!");
}
else
{
FileInfo finfo = new FileInfo(textBox1.Text);
if (finfo.Exists) //File.Exists判断文件是否存在
{
MessageBox.Show("该文件已经存在!");
}
else
{
FileStream fs=finfo.Create(); //File.Create创建文件
fs.Close();
}
}
FileInfo.Create() 方法:创建文件
FileInfo f = new FileInfo(@"c:\test.dat"); //创建文件,返回FileStream对象,FileStream能对基层文件进行同步/异步 读/写操作 FileStream fs= f.Create(); //关闭句柄来释放流的底层非托管资源 fs.Close();
FileInfo f = new FileInfo(@"c:\test.dat"); using (FileStream fs = f.Create()) { }
FileInfo.Open() 方法:打开现有文件、同时使用它也能创建文件
FileInfo f2 = new FileInfo(@"c:\Test2.dat"); using(FileStream fs2=f2.Open(FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None)) { }
FileInfo.OpenRead() 得到只读FileStream对象
FileInfo.OpenWrite() 得到只写FileStream对象
FileInfo f3 = new FileInfo(@"c:\Test3.dat"); //得到只读FileStream对象 using(FileStream readOnlyStream=f3.OpenRead()) { } FileInfo f4 = new FileInfo(@"c;\Test4.dat"); //得到只写FileStream对象 using(FileStream writeOnlyStream=f4.OpenWrite()) { }
FileInfo.OpenText() 返回StreamReader对象
FileInfo f5 = new FileInfo(@"c:\boot.ini"); //得到StreamReader 读文件流 using(StreamReader sreader=f5.OpenText()) { }
FileInfo.CreateText() 得到StreamWriter对象
FileInfo.AppendText() 得到StreamWriter对象
FileInfo f6 = new FileInfo(@"c:\test6.txt"); using(StreamWriter swriter=f6.CreateText()) {//FileInfo.CreateText() 得到StreamWriter对象} using (StreamWriter swriter2 = f6.AppendText()) {//FileInfo.AppendText() 得到StreamWriter对象}
2 Directory类和DirectoryInfo类介绍
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == string.Empty)
{
MessageBox.Show("文件夹名称不能为空!");
}
else
{
DirectoryInfo dinfo = new DirectoryInfo(textBox1.Text);
if (dinfo.Exists)
{
MessageBox.Show("该文件夹已经存在!");
}
else
{
dinfo.Create();
}
}
}
DirectoryInfo 获得目录信息
DirectoryInfo dir = new DirectoryInfo(@"c:\testing"); Console.WriteLine("*******目录信息********"); Console.WriteLine("全名称:{0}",dir.FullName); Console.WriteLine("名称:{0}", dir.Name); Console.WriteLine("父目录:{0}", dir.Parent); Console.WriteLine("创建时间:{0}", dir.CreationTime); Console.WriteLine("目录特性:{0}",dir.Attributes); Console.WriteLine("路径根:{0}",dir.Root); Console.WriteLine("*******************\n");
DirectoryInfo 获取文件夹下的xml文件
string path = Environment.CurrentDirectory; DirectoryInfo dir = new DirectoryInfo(string.Format(@"{0}\ProductsXML", path)); FileInfo[] xmlFile = dir.GetFiles("*.xml",SearchOption.AllDirectories); Console.WriteLine("发现{0} *.xml 文件\n",xmlFile.Length); foreach(FileInfo f in xmlFile) { Console.WriteLine("*******************"); Console.WriteLine("文件名称:{0}",f.Name); Console.WriteLine("文件大小:{0}",f.Length); Console.WriteLine("创建时间:{0}",f.CreationTime); Console.WriteLine("文件特性:{0}",f.Attributes); Console.WriteLine("*******************\n"); }
DirectoryInfo 创建子目录
DirectoryInfo dir = new DirectoryInfo(@"c:\"); dir.CreateSubdirectory("MyFolder"); DirectoryInfo myDataFolder= dir.CreateSubdirectory(@"MyFolder2\Data"); Console.WriteLine("新目录是:{0}",myDataFolder);
Directory 电脑驱动器 、删除目录
//电脑所有驱动器 string[] drives = Directory.GetLogicalDrives(); Console.WriteLine("电脑驱动器:"); foreach (string s in drives) Console.WriteLine("--> {0}",s); Console.WriteLine("删除目录"); Console.ReadLine(); try { Directory.Delete(@"c:\MyFolder"); Directory.Delete(@"c:\MyFolder2",true); } catch(IOException e) { Console.WriteLine(e.Message); }
DriveInfo 获取电脑驱动器
Console.WriteLine("*******盘符信息********"); DriveInfo[] myDrives = DriveInfo.GetDrives(); foreach(DriveInfo d in myDrives) { Console.WriteLine("名称:{0}",d.Name); Console.WriteLine("类型:{0}",d.DriveType); //驱动器是否已准备好 if (d.IsReady) { Console.WriteLine("可以空间:{0}",d.TotalFreeSpace); Console.WriteLine("盘符格式:{0}",d.DriveFormat); Console.WriteLine("盘符卷标:{0}",d.VolumeLabel); Console.WriteLine(); } }
二、文件基本操作
1 判断文件是否存在
2 创建文件
3 复制文件
File.Copy("c://test.txt","d://test.txt");
FileInfo finfo = new FileInfo("c://test.txt");
finfo.CopyTo("d://test.txt", true);
4 移动文件
File.Move("c://test.txt","d://test.txt");
5 删除文件
File.Delete("c://test.txt");
6 获取文件基本信息
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.Text = openFileDialog1.FileName;
FileInfo finfo = new FileInfo(textBox1.Text); //实例化FileInfo对象
string strCTime, strLATime, strLWTime, strName, strFName, strDName, strISRead;
long lgLength;
strCTime = finfo.CreationTime.ToShortDateString(); //获取文件创建时间
strLATime = finfo.LastAccessTime.ToShortDateString(); //获取上次访问该文件的时间
strLWTime = finfo.LastWriteTime.ToShortDateString(); //获取上次写入文件的时间
strName = finfo.Name; //获取文件名称
strFName = finfo.FullName; //获取文件的完整目录
strDName = finfo.DirectoryName; //获取文件的完整路径
strISRead = finfo.IsReadOnly.ToString(); //获取文件是否只读
lgLength = finfo.Length; //获取文件长度
MessageBox.Show("文件信息:/n创建时间:" + strCTime + " 上次访问时间:" + strLATime + "/n上次写入时间:" + strLWTime + " 文件名称:" + strName + "/n完整目录:" + strFName + "/n完整路径:" + strDName + "/n是否只读:" + strISRead + " 文件长度:" + lgLength);
}
三、 文件夹基本操作
1 判断文件夹是否存在
2 创建文件夹
3 移动文件夹
4 删除文件夹
5 遍历文件夹
四、 I/O(输入/输出)
1 流概述
流代表 在源文件和目标文件之间传输一定量的数据。
2 文件I/O流介绍
3 使用I/O流操作文本文件
(1)、FileStream对象 读取或写入一个字节或字节组。
FileStream类型缺点:需要操作原始字节。Encoding.Default.GetBytes 字符串转成字节数组
//获取一个FileStream对象 using (FileStream fstream = File.Open(@"c:\myMessage.dat", FileMode.Create)) { //字符串编码成字节数组 string msg = "Hello!"; byte[] msgAsByteArray = Encoding.Default.GetBytes(msg); //把byte[]写入文件 fstream.Write(msgAsByteArray, 0, msgAsByteArray.Length); //重置流内部位置 fstream.Position = 0; //从文件读取字节并显示在控制台 byte[] bytesFromFile = new byte[msgAsByteArray.Length]; for (int i = 0; i < msgAsByteArray.Length; i++) { bytesFromFile[i] = (byte)fstream.ReadByte(); Console.WriteLine(bytesFromFile[i]); } //显示解码后的字符串 Console.WriteLine(Encoding.Default.GetString(bytesFromFile)); }
(2)、StreamReader 和StreamWriter 读写基于字符(字符串)的数据。默认使用Unicode字符。
System.Text.Encoding对象 可以改变默认的Unicode编码
using(StreamWriter writer=File.CreateText("reminders.txt")) { writer.WriteLine("AAAAA"); for (int i = 0; i < 10;i++ ) { writer.Write(i+" "); } //插入新行 writer.Write(writer.NewLine); } using (StreamReader sr = File.OpenText("reminders.txt")) { string input = null; while ((input=sr.ReadLine())!=null) { Console.WriteLine(input); } } Console.ReadLine();
直接创建 StreamWriter/StreamReader类型
using (StreamWriter writer = new StreamWriter("reminders.txt")) { } using (StreamReader writer = new StreamReader("reminders.txt")) { }
(3)、创建 StringWriter ,并把字符串数据写入内存
//创建 StringWriter ,并把字符串数据写入内存 using(StringWriter strWriter=new StringWriter()) { strWriter.WriteLine("AAA"); //获取内容副本(存储在字符串中)并向控制台输出 Console.WriteLine("内容字符串输出:{0}",strWriter); using (StringReader strReader = new StringReader(strWriter.ToString())) { string input = null; while ((input = strReader.ReadLine())!=null) { Console.WriteLine(input); } } } Console.ReadLine();
4 使用I/O流操作二进制文件
BinaryReader读取器,BinaryWriter编写器,
从基层流中以简洁的二进制格式读取或写入离散数据类型.
//为文件打开一个二进制编写器 FileInfo f = new FileInfo("BinFile.dat"); using(BinaryWriter bw=new BinaryWriter(f.OpenWrite())) { //输出BaseStream的类型(这里是System.Io.FileStream) Console.WriteLine("基础流是:{0}",bw.BaseStream); //文件中存储一些数据 double aDouble = 1234.67; int anInt = 34567; string aString = "A,B,C"; //写数据 bw.Write(aDouble); bw.Write(anInt); bw.Write(aString); } using(BinaryReader br=new BinaryReader(f.OpenRead())) { Console.WriteLine(br.ReadDouble()); Console.WriteLine(br.ReadInt32()); Console.WriteLine(br.ReadString()); } Console.ReadLine();
效果:
BinFile.dat
五、 实战
1 文件批量重命名的实现
2 制作一个分割与合并文件工具
六、监控文件行为 FileSystemWatcher(监测文件什么时候创建,编辑,删除信息)
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;namespace MyDirectoryWatcher{ class Program { static void Main(string[] args) { Console.WriteLine("***** The Amazing File Watcher App *****\n"); // Establish the path to the directory to watch. FileSystemWatcher watcher = new FileSystemWatcher(); try { watcher.Path = @"C:\MyFolder"; } catch (ArgumentException ex) { Console.WriteLine(ex.Message); return; } // Set up the things to be on the lookout for. watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; // Only watch text files. watcher.Filter = "*.txt"; // Add event handlers. watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.Created += new FileSystemEventHandler(OnChanged); watcher.Deleted += new FileSystemEventHandler(OnChanged); watcher.Renamed += new RenamedEventHandler(OnRenamed); // Begin watching the directory. watcher.EnableRaisingEvents = true; // Wait for the user to quit the program. Console.WriteLine(@"Press 'q' to quit app."); while (Console.Read() != 'q') ; } static void OnChanged(object source, FileSystemEventArgs e) { // Specify what is done when a file is changed, created, or deleted. Console.WriteLine("File: {0} {1}!", e.FullPath, e.ChangeType); } static void OnRenamed(object source, RenamedEventArgs e) { // Specify what is done when a file is renamed. Console.WriteLine("File: {0} renamed to\n{1}", e.OldFullPath, e.FullPath); } }}
- 第19章 文件及I/O
- 第2章:文件I/O
- 第3章 文件I/O
- apue 第3章 文件I/O
- I/O流及文件
- 文件I/O - UNIX环境高级编程-第3章
- UNIX环境高级编程-第3章- 文件I/O
- UNIX环境高级编程-第3章 文件I/O
- 《UNIX环境高级编程》第3章 文件I/O
- Linux系统编程第13章-文件I/O缓冲
- 第三章:文件I/O
- 第三章 文件 I/O
- 第三章 文件I/O
- 第三章 文件 I/O
- 第七章、文件I/O
- 第三章:文件I/O
- 3章 文件I/O
- 第三章 文件I/O
- 实例名
- “叫兽”教你如何选美女。。。。
- 字符串分隔
- 使用Digester类的api进行xml解析的简单例子
- java代码转换成基于webservice的代码
- 第19章 文件及I/O
- 算法1:判断链表中是否有环
- 信号完整性研究:什么是信号完整性?
- 信号完整性研究:何时会遇到信号完整性问题
- 无废话之Android开发环境搭建 android 环境搭建
- Java操作Excel的方法
- 常见端口列表
- 《当程序员的那些狗日日子》(十七)短暂的混乱
- Java中 synchronized 关键字的用法