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();
效果:
//为文件打开一个二进制编写器
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);
}
}
}