版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
10.3.1 FileInfo类
FileInfo类提供用于创建、复制、删除、移动和打开文件的属性和实例方法
FileInfo类和DirectoryInfo类都是继承于FileSystemInfo类,很多属性和方法都来自FileSystemInfo,因此FileInfo和DirectoryInfo的大多数属性和方法相同,不同的方法主要有:
- AppendText:追加文本。
- CopyTo:将现有文件复制到新文件,可以根据参数决定是否允许覆盖现有文件。
- Open:在指定的模式中打开文件,可以指定打开方式、读写方式和共享访问类型。
- OpenRead:创建一个只读的 FileStream。
- OpenText:创建使用从现有文本文件中读取的 UTF8 编码的 StreamReader。
- OpenWrite:创建一个只写的 FileStream。
FileInfo重要方法:
- 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的方法主要有:
- Copy:复制文件,可以根据参数决定是否允许覆盖现有文件。
- Move:移到文件,并提供指定新文件名的选项。
- ReadAllBytes:打开一个文件,将文件的内容读入一个字符串,然后关闭该文件。
- ReadAllLines:打开一个文本文件,读取文件的所有行,然后关闭该文件。可以根据参数提供读取文本的编码。
- ReadAllText:打开一个文本文件,读取文件的所有行,然后关闭该文件。可以根据参数提供读取文本的编码。
- WriteAllBytes:创建一个新文件,在其中写入指定的字节数组,然后关闭该文件。 如果目标文件已存在,则覆盖该文件。
- WriteAllLines:创建一个新文件,在其中写入一组字符串,然后关闭该文件。可以根据参数提供写入文本的编码。
- WriteAllText:创建一个新文件,在其中写入指定的字符串,然后关闭文件。 如果目标文件已存在,则覆盖该文件。可以根据参数提供写入文本的编码。
- AppendAllLines:在一个文件中追加文本行,然后关闭该文件,可以根据参数提供读取文本的编码。
- AppendAllText:将指定的字符串追加到文件中,如果文件还不存在则创建该文件,可以根据参数提供读取文本的编码。
- 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#教程 目录