10.3 文件操作

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

10.3.1 FileInfo类

FileInfo类提供用于创建、复制、删除、移动和打开文件的属性和实例方法

FileInfo类和DirectoryInfo类都是继承于FileSystemInfo类,很多属性和方法都来自FileSystemInfo,因此FileInfo和DirectoryInfo的大多数属性和方法相同,不同的方法主要有:

  1. AppendText:追加文本。
  2. CopyTo:将现有文件复制到新文件,可以根据参数决定是否允许覆盖现有文件。
  3. Open:在指定的模式中打开文件,可以指定打开方式、读写方式和共享访问类型。
  4. OpenRead:创建一个只读的 FileStream。
  5. OpenText:创建使用从现有文本文件中读取的 UTF8 编码的 StreamReader。
  6. OpenWrite:创建一个只写的 FileStream。

FileInfo重要方法:

  1. MoveTo:移动文件。**注意:**不同于DirectoryInfo.MoveTo方法,FileInfo.MoveTo方法可以跨磁盘分区移动文件。

其余常用属性和方法请参看第10.2.1节。

10.3.1.1 获取文件信息

获得文件信息主要应用了FileInfo类的属性,它和DirectoryInfo类的属性基本一致,详细请参看第10.2.1节。

【例 10.9 【项目:code10-009】获取文件信息。

private void button1_Click(object sender, EventArgs e)

{

OpenFileDialog ofd = new OpenFileDialog();

ofd.Filter = "所有文件|*.*";

if (ofd.ShowDialog() != DialogResult.OK)

return;

FileInfo fi = new FileInfo(ofd.FileName);

textBox1.Text = "文件名称:" + fi.Name + "\r\n";

textBox1.Text += "文件路径:" + fi.FullName + "\r\n";

textBox1.Text += "扩展名:" + fi.Extension + "\r\n";

textBox1.Text += "文件大小:" + fi.Length + "字节" + "\r\n";

textBox1.Text += "创建日期:" + fi.CreationTime.ToString("yyyy-MM-dd") + "\r\n";

textBox1.Text += "修改日期:" + fi.LastWriteTime.ToString("yyyy-MM-dd") + "\r\n";

textBox1.Text += "属性:" + getFolderAttr(fi.Attributes);

}

private string getFolderAttr(FileAttributes attr)

{

string strAttr = "";

if ((attr & FileAttributes.Archive) == FileAttributes.Archive)

strAttr += " 备份";

if ((attr & FileAttributes.Hidden) == FileAttributes.Hidden)

strAttr += " 隐藏";

if ((attr & FileAttributes.Compressed) == FileAttributes.Compressed)

strAttr += " 压缩";

if ((attr & FileAttributes.Directory) == FileAttributes.Directory)

strAttr += " 目录";

if ((attr & FileAttributes.Encrypted) == FileAttributes.Encrypted)

strAttr += " 加密";

if ((attr & FileAttributes.Offline) == FileAttributes.Offline)

strAttr += " 脱机";

if ((attr & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)

strAttr += " 只读";

if ((attr & FileAttributes.System) == FileAttributes.System)

strAttr += " 系统";

if ((attr & FileAttributes.Temporary) == FileAttributes.Temporary)

strAttr += " 临时";

return strAttr;

}

运行结果如下图所示:

图10-7 显示文件的相关信息

10.3.1.2 文件的创建、删除、复制和移动

文件的创建、删除、复制和移动分别使用到了FileInfo类的Create、Delete、CopyTo和MoveTo方法。需要注意的是,Create方法会返回一个FileStream对象,程序退出之前,这个对象一直存在,导致执行删除和移动刚创建的文件发生错误,在代码中可以使用FileInfo.Create().Close(),即创建后立即关闭这个FileStream对象来避免错误。

【例 10.10 【项目:code10-010】文件的创建、删除和移动。

//源目录

private void button1_Click(object sender, EventArgs e)

{

FolderBrowserDialog fbd = new FolderBrowserDialog();

if (fbd.ShowDialog() != DialogResult.OK)

return;

label1.Text = fbd.SelectedPath;

}

//目标目录

private void button2_Click(object sender, EventArgs e)

{

FolderBrowserDialog fbd = new FolderBrowserDialog();

if (fbd.ShowDialog() != DialogResult.OK)

return;

label2.Text = fbd.SelectedPath;

}

//创建一个空文件

private void button3_Click(object sender, EventArgs e)

{

if (label1.Text == "")

return;

string filePath = label1.Text;

if(filePath.Substring(filePath.Length - 1, 1) != "\\")

filePath += "\\";

FileInfo fi = new FileInfo(filePath + "bak.jpg");

//判断文件是否存在,如果文件已经存在就退出

if (fi.Exists)

{

MessageBox.Show("文件已经存在,不能创建该文件。", "错误信息");

return;

}

//创建空文件并关闭

fi.Create().Close();

MessageBox.Show("文件创建成功。", "提示信息");

}

//删除文件

private void button4_Click(object sender, EventArgs e)

{

if (label1.Text == "")

return;

string filePath = label1.Text;

if (filePath.Substring(filePath.Length - 1, 1) != "\\")

filePath += "\\";

FileInfo fi = new FileInfo(filePath + "bak.jpg");

if(fi.Exists )

{

try

{

fi.Delete();

MessageBox.Show("文件删除成功。", "提示信息");

}

catch(Exception ex)

{

MessageBox.Show("删除文件时发生错误。" + ex.Message, "错误信息");

}

}

else

{

MessageBox.Show("文件不存在,不能删除。", "错误信息");

}

}

//移动文件

private void button5_Click(object sender, EventArgs e)

{

if (label1.Text == "" | label2.Text == "")

return;

string srcPath = label1.Text;

if (srcPath.Substring(srcPath.Length - 1, 1) != "\\")

srcPath += "\\";

string destPath = label2.Text;

if (destPath.Substring(destPath.Length - 1, 1) != "\\")

destPath += "\\";

FileInfo fi = new FileInfo(srcPath + "bak.jpg");

//判断文件是否存在

if(fi.Exists )

{

//执行移动

try

{

fi.MoveTo(destPath + "new.jpg");

MessageBox.Show("文件移动成功。", "提示信息");

}

catch( Exception ex)

{

MessageBox.Show("移动文件时发生错误。" + ex.Message, "错误信息");

}

}

else

{

MessageBox.Show("文件不存在,不能移动。", "错误信息");

}

}

//复制文件

private void button6_Click(object sender, EventArgs e)

{

if (label1.Text == "" | label2.Text == "")

return;

string srcPath = label1.Text;

if (srcPath.Substring(srcPath.Length - 1, 1) != "\\")

srcPath += "\\";

string destPath = label2.Text;

if (destPath.Substring(destPath.Length - 1, 1) != "\\")

destPath += "\\";

FileInfo fi = new FileInfo(srcPath + "bak.jpg");

//判断文件是否存在

if (fi.Exists)

{

//执行复制

try

{

fi.CopyTo(destPath + "new.jpg");

MessageBox.Show("文件复制成功。", "提示信息");

}

catch (Exception ex)

{

MessageBox.Show("复制文件时发生错误。" + ex.Message, "错误信息");

}

}

else

{

MessageBox.Show("文件不存在,不能复制。", "错误信息");

}

}

运行结果如下图所示:

图10-8 文件的创建、删除、复制和移动

10.3.2 File类

除了FileInfo类外,VB.Net还提供了File类来操作目录、获得目录信息。

就像Directory与DirectoryInfo是一对相似的类,File类和FileInfo类也很像,作用也差不多。两个类相比较,File没有提供属性,提供的方法都是静态方法,可以直接使用;而FileInfo的方法需要类实例化后使用。

File不同于FileInfo的方法主要有:

  1. Copy:复制文件,可以根据参数决定是否允许覆盖现有文件。
  2. Move:移到文件,并提供指定新文件名的选项。
  3. ReadAllBytes:打开一个文件,将文件的内容读入一个字符串,然后关闭该文件。
  4. ReadAllLines:打开一个文本文件,读取文件的所有行,然后关闭该文件。可以根据参数提供读取文本的编码。
  5. ReadAllText:打开一个文本文件,读取文件的所有行,然后关闭该文件。可以根据参数提供读取文本的编码。
  6. WriteAllBytes:创建一个新文件,在其中写入指定的字节数组,然后关闭该文件。 如果目标文件已存在,则覆盖该文件。
  7. WriteAllLines:创建一个新文件,在其中写入一组字符串,然后关闭该文件。可以根据参数提供写入文本的编码。
  8. WriteAllText:创建一个新文件,在其中写入指定的字符串,然后关闭文件。 如果目标文件已存在,则覆盖该文件。可以根据参数提供写入文本的编码。
  9. AppendAllLines:在一个文件中追加文本行,然后关闭该文件,可以根据参数提供读取文本的编码。
  10. AppendAllText:将指定的字符串追加到文件中,如果文件还不存在则创建该文件,可以根据参数提供读取文本的编码。
  11. AppendText:创建一个 StreamWriter,将UTF-8编码文本追加到现有文件。

对文本文件的读写,请参看第10.7节。

由于File类和FileInfo类方法差不多,对于获取文件信息以及对文件的创建、删除、复制和移动,请参看第10.3.1.1节和10.3.1.2节,这里不再累述。

10.3.3 模拟资源管理器

通过对DriveInfo类、DirectoryInfo类和FileInfo类的学习,本节内容将综合以上类做一个类似资源管理器的简单程序。

【例 10.11 【项目:code10-011】模拟资源管理器。

在窗体上添加一个TreeView控件、一个ListView控件和一个ImageList组件:

ImageList1中添加5张图片,分别对应我的电脑、硬盘分区、目录(关闭)、目录(打开)、文件。

ListView1设置View属性为Details,添加4标题列,分别是名称、修改日期、类型和大小。

具体代码如下:

private void Form1_Load(object sender, EventArgs e)

{

//将ImageList1和TreeView1的ImageList属性关联

treeView1.ImageList = imageList1;

//声明一个节点"我的电脑"

TreeNode root =new TreeNode("我的电脑", 0, 0);

root.Tag = "我的电脑";

root.Name = "root0";

//将节点添加为根节点

treeView1.Nodes.Add(root);

//将电脑上的磁盘分区添加到根节点

TreeNode driveNode;

DriveInfo[] drivers = DriveInfo.GetDrives();

foreach(DriveInfo singleDrive in drivers)

{

driveNode = new TreeNode(singleDrive.Name, 1, 1);

driveNode.Tag = singleDrive.Name;

treeView1.Nodes["root0"].Nodes.Add(driveNode);

}

//将ImageList1和ListView1的SmallImageList属性关联

listView1.SmallImageList = imageList1;

}

//根据选择的TreeNode在lvPath中显示相应的文件夹或文件

private void showDirAndFiles(TreeNode selectedNode )

{

listView1.Items.Clear();

//状态栏中显示当前选中的目录

toolStripStatusLabel1.Text = selectedNode.Tag.ToString();

//选择的是根节点,则不处理

if (selectedNode.Tag == "我的电脑")

return;

//清除该TreeNode下的子节点

selectedNode.Nodes.Clear();

string nowpath = (string)selectedNode.Tag;

DirectoryInfo dir =new DirectoryInfo(nowpath);

TreeNode nodeChild;

ListViewItem lvChild;

try

{

if( dir.Exists)

{

//获得选定目录下的子目录

foreach(DirectoryInfo dir_single in dir.GetDirectories())

{

//目录加入该TreeNode下,并且在Tag中保存目录路径

nodeChild = new TreeNode(dir_single.Name);

nodeChild.ImageIndex = 2;

nodeChild.SelectedImageIndex = 3;

nodeChild.Tag = dir_single.FullName;

selectedNode.Nodes.Add(nodeChild);

//ListView1中加入该目录

lvChild = new ListViewItem(dir_single.Name);

lvChild.ImageIndex = 2;

lvChild.SubItems.Add(dir_single.CreationTime.ToLongDateString());

lvChild.SubItems.Add("目录");

listView1.Items.Add(lvChild);

}

//获得选定目录下的文件

foreach(FileInfo file_single in dir.GetFiles())

{

//ListView1中加入该文件

lvChild = new ListViewItem(file_single.Name);

lvChild.ImageIndex = 4;

lvChild.SubItems.Add(file_single.LastWriteTime.ToString());

lvChild.SubItems.Add("文件");

lvChild.SubItems.Add(file_single.Length.ToString());

listView1.Items.Add(lvChild);

}

}

}

catch (Exception ex )

{

MessageBox.Show("发生错误:" + ex.Message);

}

}

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)

{

//调用showDirAndFiles方法,参数为当前选择的节点

showDirAndFiles(e.Node);

}

运行结果如下图所示:

图10-9 模拟资源管理器

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看C#教程 目录

相关推荐
黄同学real2 小时前
使用.NET 8构建高效的时间日期帮助类
后端·c#·.net
的不对不10 小时前
WPF基础03——InitializeComponent()函数解释
windows·c#·.net·wpf
步、步、为营10 小时前
C#牵手Blazor,解锁跨平台Web应用开发新姿势
开发语言·前端·c#
一念春风11 小时前
C# 小说阅读 文本文件阅读
c#
VB.Net15 小时前
10.6.1 文本文件读、写和追加
c#
VB.Net17 小时前
10.6.4 Json文件操作
c#·json
玉面小君17 小时前
适合 C# 开发者的 Semantic Kernel 入门:用 AI 赋能你的 .NET 应用
人工智能·c#·.net
军训猫猫头20 小时前
61.异步编程1 C#例子 WPF例子
开发语言·c#·wpf
pchmi21 小时前
C# OpenCV机器视觉:图像去雾
人工智能·opencv·计算机视觉·c#·opencvsharp