前言
在.Net中,对文件(File)和文件夹(Folder)的操作可以使用File类和Directory类,也可以使用FileInfo类和DirectoryInfo类。文件夹(Folder)是只在Windows操作系统中使用的名词。在操作系统的理论中,人们更习惯于使用目录(Directory)这个名词。或许微软为了有朝一日将.Net移植到其他的操作系统中(实际上也有很多人也在做着这个项目),所以还是以Directory来命名操作文件夹的类。
说明
命名空间:using System .IO;
1. File类(static):
创建文件:File.Create(路径);创建文件,返回FileStream
FileStream fs = File.Create(路径);之后需要关闭否则打不开,fs.close();
删除文件:File.Delete(路径);无返回值
复制文件:File.Copy(源文件,目标文件);
剪切文件:File.Move(源文件路径,目标路径);
判断文件是否存在:File.Exists(路径);返回布尔型,true代表已存在
文件加密:File.Encrypt();
解密:File.Decrypt();
获取创建时间:File.GetCreationTime(路径);返回DateTime类型
修改创建时间:SetCreationTime(路径,DateTime类型);
最后访问时间:File.GetLastAccessTime(路径);返回DateTime类型
修改访问时间:SetLastAccessTime(路径,DateTime类型);
最后修改时间:File.GetLastWriteTime(路径);返回DateTime类型
修改最后修改时间:SetLastWriteTime(路径,DateTime类型);
2. Directory 类(static):目录(文件夹)
创建目录:Directory .CreateDirectory(路径);
删除目录:Directory .Delete(路径);
目录是否存在:Directory .Exists(路径);
获取子目录:Directory .GetDirectories(路径); 返回string数组
获取子文件名:Directory .GetFiles(路径); 返回string数组,string[] s = Directory .GetFiles(路径);
获取根目录:Directory .GetDirectoryRoot(路径);
获取上一级目录:Directory .GetParent(路径);
以下是实例方法,需要造对象new出来才能用,上面的都是静态方法
3.FileInfo 类
创建文件:FileInfo f = new FileInfo(路径); FileStream s = f.Create(); s.Close();
删除文件:FileInfo f = new FileInfo(路径); f.Delete();如果文件不存在会报错
复制文件:FileInfo f = new FileInfo(路径); f.CopyTo(目标路径,是否覆盖(true是覆盖));
移动文件:FileInfo f = new FileInfo(路径); f.MoveTo(目标路径);
文件是否存在:FileInfo f = new FileInfo(路径); bool b = f.Exists;布尔型,是个属性
获取文件名:FileInfo f = new FileInfo(路径);string s = f.FullName;属性,带路径的文件名
获得创建时间:DateTime d = f.CreationTime;
获取文件大小:f.Length
4.DirectoryInfo 类
创建目录:DirectoryInfo d = new DirectoryInfo(路径); d.Create();
删除目录:d.Delete();
移动目录:d.MoveTo(目标路径);
目录是否存在:bool b = d.Exists;
获得目录全名:d.FullName;
获得子文件对象信息数组: FileInfo[] f = d.GetFiles(); 返回的是文件对象数组,内容更详细,d.GetFiles("*.exe")只获取exe的文件
获得子目录数组:DirectoryInfo[] dr = d.GetDirectories();
5.FileMode枚举(打开或者创建文件的形式)
FileMode.CreateNew (创建新文件,如果文件已存在将会报错)
FileMode.Create (创建新文件。 如果文件已存在,它将被覆盖)
FileMode.Open (打开现有文件,如果文件不存在,报错)
FileMode.OpenOrCreate (打开文件(如果文件存在);否则,应创建新文件)
FileMode.Truncate (打开现有文件。 该文件被打开时,将被截断为零字节大小)
FileMode.Append (在已有的文本中追加,如果不存在,将会创建)
使用File/Directory(静态类)还是FileInfo/DirectoryInfo?
File类和Directory类都是静态类。使用它们的好处是不需要初始化对象。如果你对某一个文件或文件夹只进行一次操作,那你最好使用该静态类的静态方法,比如File.Move,File.Delete等等。如果你需要对一个文件或文件夹进行多次操作,那最好还是使用FileInfo和DirectoryInfo类。因为File类和Directory是静态类,所以你每次对一个文件或文件夹进行操作之前,它们都需要对该文件或文件夹进行一些检查,比如authentication。如果使用FileInfo类和DirectoryInfo类,只在初始化类的对象时进行相关的检查工作,也就是说只需要做一次,所以如果你需要对某个文件或文件夹进行多次操作,那最好使用FileInfo类和DirectoryInfo类。
示例
【1】生成TXT文本
static void Xieru()
{
//创建图书集合
List<Book> booklist = new List<Book>();
booklist.Add(new Book() { Name = "鹿鼎记", Chubansheming = "人民文学出版社", Jiage = "120" });
booklist.Add(new Book() { Name = "绝代双骄", Chubansheming = "中国长安出版社", Jiage = "50" });
///////写入文本
//系统桌面路径
string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
//创建文件流 构造函数(保存或者打开文件的路径,指示如何打开或者创建文件)
FileStream filestream = new FileStream(path + "\\book.txt", FileMode.Create);
//创建写入器 构造函数(要写入的流,要使用的字符编码。)
StreamWriter sw = new StreamWriter(filestream, Encoding.GetEncoding("UTF-8"));
//写入图书总数
sw.WriteLine(booklist.Count);
//遍历图书集合,写入图书对象
foreach (var i in booklist)
{
sw.WriteLine(i.Name);
sw.WriteLine(i.Chubansheming);
sw.WriteLine(i.Jiage);
}
//关闭写入器
sw.Close();
//关闭文件流
filestream.Close();
Console.WriteLine("文件写入成功!");
}
【2】读取TXT文本
static void Read()
{
//创建文件流
FileStream filestream = new FileStream(path,FileMode.Open);
//创建读取器
StreamReader streamreader = new StreamReader(filestream,Encoding.GetEncoding("UTF-8"));
//输出展示
int j = Convert.ToInt32(streamreader.ReadLine());//第一行是几本书 确定循环次数
for (int i = 0; i < j; i++ )
{
Console.WriteLine("第{0}本书:",i+1);
Console.WriteLine("书名:" + streamreader.ReadLine());
Console.WriteLine("出版社:" + streamreader.ReadLine());
Console.WriteLine("价格:" + streamreader.ReadLine() + "\n");
}
}
资源管理器示例
把磁盘目录加载至TreeView中,对其子文件的删除或者复制操作
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
Initial();
}
public void Initial() //初始化
{
//初始化ListView
this.listView1.View = View.Details;
this.listView1.Columns.Add("文件名", 150, HorizontalAlignment.Center);
this.listView1.Columns.Add("大小(KB)", 100, HorizontalAlignment.Left);
this.listView1.Columns.Add("文件类型", 70, HorizontalAlignment.Center);
this.listView1.Columns.Add("文件路径", 270, HorizontalAlignment.Center);
//初始化D盘节点
this.treeView1.Nodes.Add("E:\\");
this.treeView1.Nodes[0].Tag = "E:\\";
//初始化ListView
this.listView1.FullRowSelect = true; //整行选中
this.listView1.GridLines = true; //显示网格线
this.listView1.ContextMenuStrip = this.contextMenuStrip1;
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) //节点选择事件
{
//清除选中节点的子节点
this.treeView1.SelectedNode.Nodes.Clear();
//创建目录 构造函数(路径)
DirectoryInfo dicectoryInfo = new DirectoryInfo(this.treeView1.SelectedNode.Tag.ToString());
try
{
//根据GetDirectories()方法返回当前目录的目录,返回值是一个目录数组
DirectoryInfo[] dirs = dicectoryInfo.GetDirectories();
//遍历目录数组,循环创造子节点添加至其选中的节点中
foreach (DirectoryInfo di in dirs)
{
TreeNode node = new TreeNode();
node.Text = di.Name; //目录名称
node.Tag = di.FullName; //目录路径
this.treeView1.SelectedNode.Nodes.Add(node);//添加至选中的节点中
}
//根据GetFiles()方法返回当前目录下的文件列表
FileInfo[] fileinfo = dicectoryInfo.GetFiles();
//清除ListView项
this.listView1.Items.Clear();
//遍历文件数组,加载至ListView中
foreach(FileInfo myFile in fileinfo)
{
//创建ListView项
ListViewItem item = new ListViewItem();
item.Text = myFile.Name; //文件名
item.SubItems.Add((myFile.Length/1024).ToString()); //文件大小
item.SubItems.Add(myFile.Extension.Substring(1)); //文件类型
item.SubItems.Add(myFile.FullName); //文件路径
//添加至ListView中
this.listView1.Items.Add(item);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
private void 复制ToolStripMenuItem_Click(object sender, EventArgs e)
{
if(this.listView1.SelectedItems.Count !=1 )return;
try
{
//创建打开文件窗口对象
FolderBrowserDialog fdb = new FolderBrowserDialog();
//获取返回结果
DialogResult result = fdb.ShowDialog();
//确保用户选择了确定
if (result != DialogResult.OK) return;
//源路径
string sourcePath = this.listView1.SelectedItems[0].SubItems[3].Text;
//新路径(用户选择的路径+文件名)
string desPath = fdb.SelectedPath + this.listView1.SelectedItems[0].Text;
//使用File类的静态方法(源路径,新路径,是否覆盖)
File.Copy(sourcePath, desPath);
MessageBox.Show("复制成功!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (this.listView1.SelectedItems.Count != 1) return;
if (DialogResult.OK != MessageBox.Show("确认删除吗?")) return;
try
{
//在磁盘中删除选中项
new FileInfo(this.listView1.SelectedItems[0].SubItems[3].Text).Delete();
//在ListView中删除选中项
this.listView1.SelectedItems[0].Remove();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
2018-9-4