C#/Winfrom -文件操作
一、文件对话框
(3)打开文件夹的对话框FolderBroswerDialog
示例:如下图,点击三个按钮分别弹出三种对话框,进行相应操作之后,将路径在文本框中显示:
通过ShowDialog()的返回值,判断点击的是“打开“还是“取消”。在“打开”按钮点击事件中编写如下代码:
private void button1_Click(object sender, EventArgs e)
{ //如果打开文件对话框 返回值ok
if (this.openFileDialog1.ShowDialog()== DialogResult.OK)
{ //保存文件路径到文本框
this.txtPath.Text = this.openFileDialog1.FileName;
}
}
属性名 | |
InitialDirectory | |
Filter | 文本文件|*.txt | 所有文件|*.* |
在对话框中选择的文件筛选器的索引,如果选第一项就设为1 | |
第一个在对话框中显示的文件或最后一个选取的文件 | |
将显示在对话框标题栏中的文字,描述对话框 | |
在用户指定不存在的文件时是否显示警告 | |
设置保存文件对话框的Fiter属性为“文本文件|*.txt”。在“保存”按钮的点击事件中编写如下代码:
private void button3_Click(object sender, EventArgs e)
{
if(this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{// 返回被选中路径SelectedPath
this.txtPath.Text = this.folderBrowserDialog1.SelectedPath;
}
}
属性名 | |
Description | |
RootFolder | |
SelectedPath | |
ShowNewFold |
二、文件及文件夹操作
Directory类和DirectoryInfo类用于对磁盘和文件夹的操作管理,
文件常用操作
在C#中如果对文件进行创建、复制和删除等少量操作一般使用File类。
Fie类是静态类,其中所有方法都是静态的,通过类名直接调用,不需要实例化。
- 点击”选择文件"按钮选择某个文件,并将文件路径在文本框显示。
- 点击”选择文件夹"按钮选择某个文件夹,并将文件夹路径在文本框显示。
- 点击”复制文件"按钮,实现将文件复制到文件夹中, File.Copy();
- 点击"移动文件”按钮,实现将文件移动到文件夹中。File.Move();
- 点击”删除文件“按钮,实现将文件删除。File.Delete();
//打开文件
private void openFileBtn_Click(object sender, EventArgs e)
{
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
texFileName.Text = openFileDialog1.FileName;
}
}
//打开文件夹
private void openFolderBtn_Click(object sender, EventArgs e)
{
if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
texFolderName.Text = folderBrowserDialog1.SelectedPath;
}
}
//复制文件
private void copyBtn_Click(object sender, EventArgs e)
{
//判断源文件是否存在
if (!File.Exists(texFileName.Text))
{
MessageBox.Show("文件不存在");
return;
}//判断目标文件夹是否存在
if (!Directory.Exists(texFolderName.Text))
{
MessageBox.Show("文件不存在");
return;
}
string sourceFile = texFileName.Text;//源文件
//处理目标文件
string[] arrFile = sourceFile.Split("\\");
string destFileName = texFolderName.Text + "\\" + arrFile[arrFile.Length - 1];
File.Copy(sourceFile, destFileName, true);
MessageBox.Show("文件复制成功");
}
//移动文件
private void moveBtn_Click(object sender, EventArgs e)
{
//判断源文件是否存在
if (!File.Exists(texFileName.Text))
{
MessageBox.Show("文件不存在");
return;
}//判断目标文件夹是否存在
if (!Directory.Exists(texFolderName.Text))
{
MessageBox.Show("文件不存在");
return;
}
string sourceFile = texFileName.Text;//源文件
//处理目标文件
string[] arrFile = sourceFile.Split("\\");
string destFileName = texFolderName.Text + "\\" + arrFile[arrFile.Length - 1];
//如果目标文件夹有重名文件 直接删除再复制
if (File.Exists(destFileName))
{
File.Delete(destFileName);
}
File.Move(sourceFile, destFileName);
MessageBox.Show("文件移动成功");
}
//删除文件
private void deleteBtn_Click(object sender, EventArgs e)
{
//判断源文件是否存在
if (!File.Exists(texFileName.Text))
{
MessageBox.Show("文件不存在");
return;
}
string sourceFile = texFileName.Text;//源文件
File.Delete(sourceFile);
MessageBox.Show("文件已删除");
}
}
//复制文件
private void copyBtn_Click(object sender, EventArgs e)
{
FileInfo fileInfo = new FileInfo(texFileName.Text);
if (!fileInfo.Exists)
{
MessageBox.Show("文件不存在");
return;
}
DirectoryInfo directoryInfo = new DirectoryInfo(texFolderName.Text);
if (!directoryInfo.Exists)
{
MessageBox.Show("文件夹不存在");
return;
}
string[] array = texFileName.Text.Split("\\");
string newName = array[array.Length - 1];
fileInfo.CopyTo(texFolderName.Text + "//" + newName);
MessageBox.Show("文件复制成功");
}
//移动文件
private void moveBtn_Click(object sender, EventArgs e)
{
FileInfo fileInfo = new FileInfo(texFileName.Text);
if (!fileInfo.Exists)
{
MessageBox.Show("文件不存在");
return;
}
DirectoryInfo directoryInfo = new DirectoryInfo(texFolderName.Text);
if (!directoryInfo.Exists)
{
MessageBox.Show("文件夹不存在");
return;
}
string[] array = texFileName.Text.Split("\\");
string newName = array[array.Length - 1];
fileInfo.MoveTo(texFolderName.Text + "//" + newName);
MessageBox.Show("文件移动成功");
}
//删除文件
private void deleteBtn_Click(object sender, EventArgs e)
{
FileInfo fileInfo = new FileInfo(texFileName.Text);
if (!fileInfo.Exists)
{
MessageBox.Show("文件不存在");
return;
}
fileInfo.Delete();
MessageBox.Show("文件删除成功");
}
}
文件夹常用操作 无copy
Directory类是静态类,其中所有方法都是静态的,通过类名直接调用。示例,如下图,进行文件夹的基本操作:
点击”选择文件夹一”按钮,选择文件夹,并把文件夹路径显示在第一个文本框。
点击”选择文件夹二”按钮,选择文件夹,并把文件夹路径显示在第二个文本框。
点击”移动文件夹"按钮,将第一个文本框路径的文件夹移动到第二个文本框路径的文件夹下。
点击”删除文件夹”按钮,将第一个文本框路径的文件夹进行删除。
private void btnMove_Click(object sender, EventArgs e)
{
if (!Directory.Exists(textFolder1.Text) || !Directory.Exists(textFolder2.Text))
{
MessageBox.Show("文件夹不存在");
}
//处理目标文件路径
string[] arrayFolder = textFolder1.Text.Split("\\");
string distFolder = textFolder2.Text + "\\" + arrayFolder[arrayFolder.Length - 1];
Directory.Move(textFolder1.Text,distFolder);
MessageBox.Show("移动成功");
}
private void btnDelete_Click(object sender, EventArgs e)
{
if (!Directory.Exists(textFolder1.Text)){
MessageBox.Show("文件夹不存在");
return;
}
Directory.Delete(textFolder1.Text);
MessageBox.Show("删除成功");
}
}
- directory1.Exists 属性
- directory1.MoveTo(distFolder); 方法
- directory1.Delete(true);方法
private void btnMove_Click(object sender, EventArgs e)
{
DirectoryInfo directory1 = new DirectoryInfo(textFolder1.Text);
DirectoryInfo directory2 = new DirectoryInfo(textFolder2.Text);
if (!directory1.Exists || !directory2.Exists)
{
MessageBox.Show("文件夹不存在");
}
//处理目标文件路径
string[] arrayFolder = textFolder1.Text.Split("\\");
string distFolder = textFolder2.Text + "\\" + arrayFolder[arrayFolder.Length - 1];
directory1.MoveTo(distFolder);
MessageBox.Show("移动成功");
}
private void btnDelete_Click(object sender, EventArgs e)
{
DirectoryInfo directory1 = new DirectoryInfo(textFolder1.Text);
if (!directory1.Exists)
{
MessageBox.Show("文件夹不存在");
return;
}
directory1.Delete(true);
MessageBox.Show("删除成功");
}
}
跨盘符文件夹的复制和移动(剪切)
- 关于文件夹的移动,系统提供给我们的功能,只能在同一个根盘符上操作。
- 关于文件夹的复制,系统根本就没有提供相应的API。
所以关于文件夹的复制以及文件移动跨磁盘只能自己写,自己实现了,如图:
点击”选择文件夹一"按钮:可以选择一个文件夹,并且将文件夹的路径显示在第一个文本框。
点击”选择文件夹二"按钮:可以选择一个文件夹,并且将文件夹的路径显示在第二个文本框。
点击”复制文件夹”按钮:将第一个文件夹及文件夹内容复制到第二个文件夹中。
点击"移动文件夹”按钮:将第一个文件夹及文件夹内容移动到第二个文件夹中。
//文件夹的跨盘符移动 递归调用
public void copyFolder(string startPath , string endPath)
{
DirectoryInfo directoryInfo = new DirectoryInfo(startPath);
Directory.CreateDirectory(endPath);
//遍历源文件夹下的所有文件
foreach (FileInfo file in directoryInfo.GetFiles())
//获得文件名,组装成完整路径
{
file.CopyTo(endPath + "\\" + file.Name);
}//遍历源文件下的文件夹 在目标文件夹下创建新的文件夹
foreach (DirectoryInfo directory in directoryInfo.GetDirectories())
{
string strPath = directory.FullName;
string ePath = endPath + "\\" + directory.Name;
copyFolder(strPath, ePath);
}
}
private void btnCopy_Click(object sender, EventArgs e)
{
DirectoryInfo directory1 = new DirectoryInfo(textFolder1.Text);
DirectoryInfo directory2 = new DirectoryInfo(textFolder2.Text);
if (directory1.Exists == false ||directory2.Exists == false)
{
MessageBox.Show("文件夹不存在");
}
//处理目标文件路径
string[] arrayFolder = textFolder1.Text.Split("\\");
string distFolder = textFolder2.Text + "\\" + arrayFolder[arrayFolder.Length - 1];
copyFolder(directory1.FullName, distFolder);
MessageBox.Show("复制成功");
}
private void btnMove_Click(object sender, EventArgs e)
{
DirectoryInfo directory1 = new DirectoryInfo(textFolder1.Text);
DirectoryInfo directory2 = new DirectoryInfo(textFolder2.Text);
if (directory1.Exists == false || directory2.Exists == false)
{
MessageBox.Show("文件夹不存在");
}
//处理目标文件路径
string[] arrayFolder = textFolder1.Text.Split("\\");
string distFolder = textFolder2.Text + "\\" + arrayFolder[arrayFolder.Length - 1];
copyFolder(directory1.FullName, distFolder);
directory1.Delete(true);
MessageBox.Show("剪切成功");
}
读写文本文件
文件是在各种媒质上永久存储的数据的有序集合。它是进行数据读写操作的基本对象-
流是一种向存储器读取和写入字节的方式,也是进行数据读写操作的基本对象
Filestream(文件流 ) seek() 移动文件指针
FileStream fs = new FileStream(FileName, FileMode,FileAccess);
值名称 | |
CreateNew | |
Create | |
Open | |
OpenOrCreate | |
Append | |
Truncate |
值说明 | |
Read | |
Write | |
ReadWrite |
值名称 | |
Read | |
ReadLine | |
ReadToEnd | |
Close |
值名称 | |
Write | |
WriteLine | |
Close |
点击"打开文件"按钮,选择一个文本文件,并且将文本文件路径显示在上面单行文本框中,将文本文件的内容显示在下面的多行文本框中。
- fs.Read(bytes,0, len) 一次性读完
- fs.ReadByte(); // 一个字节一个字节读
private void btnOpen_Click(object sender, EventArgs e)
{
if(this.openFileDialog1.ShowDialog() == DialogResult.OK)
{ //将文件路径保存到文本框中
this.textPath.Text = this.openFileDialog1.FileName;
}else
return;
//显示文本内容
//方案一:FileStream将文件一次性读到byte[]中,然后再转换成字符串
FileStream fs = new FileStream(textPath.Text,FileMode.Open,FileAccess.Read);
int len = (int)fs.Length; //获取文件流中的字节长度
byte[] bytes = new byte[len];//定义字节数组保存文本内容
fs.Read(bytes,0, len); //文件流读入字节数组中
//字节数组转换成字符串存入文本框中
this.textContent.Text = Encoding.UTF8.GetString(bytes);
fs.Close();
//***************************************************************************************
//方案二:FileStream将文件一次性读到byte[]中,然后再转换成字符串
FileStream fs = new FileStream(textPath.Text, FileMode.Open, FileAccess.Read);
int len = (int)fs.Length; //获取文件流中的字节长度
byte[] bytes = new byte[len];//定义字节数组保存文本内容
int index = 0; //初始化索引
int code = fs.ReadByte(); //读取第一个字节 code = -1 表示读完
while (code != -1)
{
bytes[index] =Convert.ToByte(code); //读取内容存入字节数组中
code = fs.ReadByte(); //继续读字节
index++;
}//字节数组转换成字符串存入文本框中
this.textContent.Text = Encoding.UTF8.GetString(bytes);
fs.Close();
//***************************************************************************************
//方案三:使用FIle静态类 适合读取小文件
this.textContent.Text = File.ReadAllText(textPath.Text);
//***************************************************************************************
//方案四:使用StreamReader读取文件内容,可以异步读取
FileStream fs = new FileStream(textPath.Text, FileMode.Open,FileAccess.Read);
//创建StreamReader实例
StreamReader sr = new StreamReader(fs);
this.textContent.Text = sr.ReadToEnd();
sr.Close();
fs.Close();
}
写入文件后保存
File.WriteAllTex() 静态类
StreamWriter 类的实例方法
//使用静态类写入文件
File.WriteAllText(textPath.Text, textContent.Text, Encoding.Default);
MessageBox.Show("文件保存成功");
//***************************************************************************************
//使用StreamWriter 写入文本内容 FileAccess.Write
FileStream fs = new FileStream(textPath.Text, FileMode.Open, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs, Encoding.Default);
sw.Write(textContent.Text);
sw.Close();
fs.Close();
MessageBox.Show("文件保存成功");