目录和文件的操作
文件操作
数据存储与文件操作
数据的存取方式
- 数据库存取 -> 适合大量、且关系复杂并有序的数据存取。
- 文件存取 -> 适合大量、数据关系简单的数据存取,如系统的日志文件等。
文件存取的好处
- 读取操作方便。
- 文件可以存储在任何介质中。
文件存取的方式
文本文件的写入和读取
private void button1_Click(object sender, EventArgs e)
{
//1.创建一个文件流
FileStream fs = new FileStream(@"myfile.txt",FileMode.Create);
//2.创建写入器
StreamWriter sw = new StreamWriter(fs);
//3.以流的方式写入数据
//sw.WriteLine();//写入数据,并添加结束符
//String.Trim() ,TrimStart(),TrimEnd() 去掉字符串 前后 的空格
//String.Replace()函数可以去掉字符串中 所有 的空格
//str.Replace(" ", "")
sw.Write(this.textBox1.Text.Trim());
//4.关闭写入器
sw.Close();
//5.关闭文件流
fs.Close();
}
private void button2_Click(object sender, EventArgs e)
{
//1.创建文件流
FileStream fs = new FileStream(@"myfile.txt", FileMode.Open);
//2.创建读取器
StreamReader sr = new StreamReader(fs,Encoding.UTF8);
//3.以流的方式读取数据
this.textBox1.Text = sr.ReadToEnd();
//4.关闭写入器
sr.Close();
//5.关闭文件流
fs.Close();
}
private void button3_Click(object sender, EventArgs e)
{
//1.创建文件流
//FileMode.Append 追加数据
FileStream fs = new FileStream(@"myfile.txt", FileMode.Append);
//2.创建写入器
StreamWriter sw = new StreamWriter(fs);
//3.以流的方式"逐行"写入数据
sw.WriteLine(DateTime.Now.ToString()+"[文件操作正常....]");
//4.关闭写入器
sw.Close();
//5.关闭文件流
fs.Close();
}
文本文件的删除、复制和移动
什么时候用到删除、复制和移动,比如在线升级或者下载文件时,一般都是先下载到某个临时文件夹中,下载成功没有问题的时候,再复制备份或者移动到目的文件夹中。
//删除文件
private void button4_Click(object sender, EventArgs e)
{
File.Delete(this.textBox2.Text);
}
//复制文件
private void button5_Click(object sender, EventArgs e)
{
//首先判断路径文件是否存在
if (File.Exists(this.textBox2.Text))
{
//Ctrl+C
File.Copy(this.textBox2.Text, this.textBox3.Text);
}
}
//移动文件
private void button6_Click(object sender, EventArgs e)
{
//Ctrl + X
File.Move(this.textBox2.Text, this.textBox3.Text);
}
目录的操作
//显示指定目录下所有的文件
private void button7_Click(object sender, EventArgs e)
{
string [] files= Directory.GetFiles(@"E:\机器视觉\机器视觉16班\Winform窗体程序\课件\0408_文件操作\01_目录和文件的操作");
//this.textBox1.Text = "";
this.textBox1.Clear();
foreach (string file in files) {
this.textBox1.Text+= file+"\r\n";
}
}
//显示指定目录下的所有子目录
private void button8_Click(object sender, EventArgs e)
{
//目录下的子目录
//string[] dirs= Directory.GetDirectories(@"E:\机器视觉\机器视觉16班\Winform窗体程序\课件\0408_文件操作\01_目录和文件的操作");
this.textBox1.Text = "";
//this.textBox1.Clear();
//foreach (string dir in dirs) {
// this.textBox1.Text += dir + "\r\n";
//}
//目录下的所有子目录(包括子目录的目录)
//递归: 函数自己调用自己(要有终止条件,没有终止条件就是死循环)
this.textBox1.Clear();
GetAllsubDit(@"E:\机器视觉\机器视觉16班\Winform窗体程序\课件\0408_文件操作\01_目录和文件的操作");
}
private void GetAllsubDit(string path)
{
string[] dirs = Directory.GetDirectories(path);
foreach (string dir in dirs)
{
//判断当前目录是否还有子目录,如果还有子目录,需要再次进行函数的调用
if (Path.GetDirectoryName(dir).Length>0)
{
GetAllsubDit(dir);
}
this.textBox1.Text += dir + "\r\n";
}
}
//在指定目录下创建一个子目录
private void button9_Click(object sender, EventArgs e)
{
Directory.CreateDirectory(@"吴亦凡");
}
//删除指定目录下的所有的子目录和文件
private void button10_Click(object sender, EventArgs e)
{
//删除 只能删除空目录
//Directory.Delete(@"吴亦凡");
//使用DirectoryInfo的实例对象调用Delete方法并设置参数为true,可以删除非空目录
DirectoryInfo dir = new DirectoryInfo(@"吴亦凡");
dir.Delete(true);
}
文件属性操作
File类与FileInfo都能实现。静态方法与实例化方法的区别
//只读 ReadOnly 和 隐藏 Hidden
//获取文件的属性
//Console.WriteLine(File.GetAttributes(@"C:\OneDriveTemp"));
//设置文件的属性
// File.SetAttributes(@"C:\吴亦凡", FileAttributes.ReadOnly);
FileInfo fi = new FileInfo(@"C:\吴亦凡");
// Console.WriteLine(fi.Attributes.ToString());
//设置
fi.Attributes = FileAttributes.ReadOnly;
fi.Attributes = FileAttributes.Archive;
//使用 | 设置多个属性
//只读属性和系统属性,删除的时候会拒绝访问
fi.Attributes = FileAttributes.Archive | FileAttributes.ReadOnly;
Console.WriteLine(fi.Attributes.ToString());
文件路径
文件和文件夹的路径操作都在Path类中。另外还可以用Environment类,里面包含环境和程序的信息。
//相对路径:不完整的路径,相对于bin\Debug
//绝对路径:完整的路径,从盘符开始
string dirPath = @"C:\Users\12015\Desktop\C#工业软件开发文档";
string filePath = @"C:\Users\12015\Desktop\C#工业软件开发文档\打开项目\1.png";
//获取当前路径
Console.WriteLine(Environment.CurrentDirectory);
Console.WriteLine("----------------------");
//获取文件或者文件夹所在的目录
Console.WriteLine(Path.GetDirectoryName(dirPath));
Console.WriteLine(Path.GetDirectoryName(filePath));
//获取文件后缀
Console.WriteLine(Path.GetExtension(filePath));
//获取文件或者文件夹的名字
Console.WriteLine(Path.GetFileName(dirPath));
Console.WriteLine(Path.GetFileName(filePath));
//获取绝对路径
Console.WriteLine(Path.GetFullPath(dirPath));
Console.WriteLine(Path.GetFullPath(filePath));
Console.WriteLine(Path.GetFullPath(@"1.txt"));
//更改文件后缀
Console.WriteLine(Path.ChangeExtension(filePath,"jpg"));
//生成路径
Console.WriteLine(Path.Combine(new string[] { @"C:\", "Users", "12015" }));
//获取根路径
Console.WriteLine(Path.GetPathRoot(filePath));
//随机生成文件或者文件名
Console.WriteLine(Path.GetRandomFileName());
//----------------------了解-----------------
//获取文件名中的无效字符
Console.WriteLine(Path.GetInvalidFileNameChars());
//获取路径中的无效字符
Console.WriteLine(Path.GetInvalidPathChars());
//获取当前系统临时文件夹的路径
Console.WriteLine(Path.GetTempPath());
Console.WriteLine(Path.GetTempFileName());
//..............
文件对话框
常用属性表:
属性名 | 功能说明 |
---|---|
InitialDirectory | 对话框的初始目录 |
Filter | 文件筛选器,按"显示名称|类型"格式编写 例如,“文本文件(.txt)|.txt|所有文件(.)||.” |
FileName | 选取的文件的路径 |
Title | 将显示在对话框标题栏中的字符 |
RestoreDirectory | 指示对话框在关闭前是否还原当前目录。 |
CheckPathExists | 在对话框返回之前,检查指定路径是否存在 |
OpenFileDialog对话框
openFileDialog1.InitialDirectory = @"E:\";
openFileDialog1.Filter = "文本文件|*.txt";
openFileDialog1.Title = "选择txt文件";
if (this.openFileDialog1.ShowDialog()==DialogResult.OK)
{
//openFileDialog1.FileName;
FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);
StreamReader sr = new StreamReader(fs, Encoding.UTF8);
this.textBox1.Text = sr.ReadToEnd();
sr.Close();
fs.Close();
}
SaveFileDialog对话框
保存文件对话框常用于软件中的“另存为”功能。其常用属性、方法及使用方式与打开文件对话框相同。
saveFileDialog1.InitialDirectory = @"E:\";
saveFileDialog1.Filter = "文本文件|*.txt";
saveFileDialog1.Title = "另存为txt文件";
if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)
{
FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
sw.Write(this.textBox1.Text.Trim());
sw.Close();
fs.Close();
}
扩展:
https://blog.csdn.net/wenchm/article/details/134676994
CSV文件读写与DataGridView进阶
DataGridView主要属性:
DataSource
DataSource
属性用于设置 DataGridView
控件的数据源。常用的数据源类型有:
DataTable
:从数据库查询得到的数据表/读取的文件。List<T>
:泛型集合,其中T
是数据模型的类型。
行(Row 相关属性)
- DataGridViewRow: 表示
DataGridView
控件中的一行。 - DataGridViewRowCollection: 表示
DataGridView
控件中所有行的集合。 - Rows: 通过此属性可以访问或操作行集合中的行。
列(Column 相关属性)
- DataGridViewColumn: 表示
DataGridView
控件中的一列。 - DataGridViewColumnCollection: 表示控件中所有列的集合。
- Columns: 通过此属性可以访问或操作列集合中的列。
CSV(Comma Separated Values 逗号分隔值)
是一种文件格式(如.txt、.doc等),也可理解 .csv 文件就是一种特殊格式的纯文本文件。即是一组字符序列,字符之间已英文字符的逗号或制表符(Tab)分隔。
在 windows 系统环境上 .csv 文件打开方式有多种,如记事本、excel、Notepad++ 等,只要是文本编辑器都能正确打开。
CSV文件格式
CSV文件格式旨在存储表格数据,该数据通常包含行和列。每一行数据代表表格中的一行,每一列代表表格中的一列。CSV文件中每个数据字段之间都使用逗号分隔。每一行以换行符结束。如:
姓名,年龄,性别
小明,20,男
小红,18,女
小华,19,女
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog()==DialogResult.OK)
{
FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);
StreamReader sr = new StreamReader(fs,Encoding.Default);
DataTable dataTable = new DataTable();
string data;//将读取到的一行数据存储到里面
string[] lines;
bool isFirst=true;
//字符串==>DataTable==>DataSource
while ((data=sr.ReadLine())!=null)
{
lines = data.Split(',');//将data里面的数据以,分割存储lines数组中
if (isFirst)
{
//判断是否是第一次读,如果是第一次读,就是读取每一列的第一个数据
for (int i = 0; i < lines.Length; i++)
{
dataTable.Columns.Add(lines[i]);
}
isFirst = false;
}
else
{
//如果不是第一次读取,就新增一行
DataRow dataRow= dataTable.NewRow();
for (int i = 0; i < lines.Length; i++)
{
dataRow[i] = lines[i];
}
dataTable.Rows.Add(dataRow);
}
}
if (dataTable.Rows.Count==0)
{
MessageBox.Show("没有数据");
}
else
{
dataGridView1.ColumnCount=dataTable.Columns.Count;
for (int i = 0; i < dataTable.Columns.Count; i++)
{
dataGridView1.Columns[i].HeaderText = dataTable.Columns[i].ColumnName;
}
for (int i = 0; i < dataTable.Rows.Count; i++)
{
dataGridView1.Rows.Add(dataTable.Rows[i].ItemArray);
}
}
sr.Close();
fs.Close();
}
}
private void button2_Click(object sender, EventArgs e)
{
//DataSource==>DataTable==>字符串
DataTable dataTable = new DataTable();
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
dataTable.Columns.Add(dataGridView1.Columns[i].HeaderText);
}
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
DataRow dr= dataTable.NewRow();
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
//将datagridView组件中某一个单元格的值传给dataTable
dr[j] = dataGridView1[j, i].Value;
}
dataTable.Rows.Add(dr);
}
saveFileDialog1.Filter = "CSV files (*.csv)|*.csv";
if (saveFileDialog1.ShowDialog()==DialogResult.OK)
{
FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create);
StreamWriter sw = new StreamWriter(fs,Encoding.Default);
string data = null;
for (int i = 0; i < dataTable.Columns.Count; i++)
{
data += dataTable.Columns[i].ColumnName.ToString();
if (i<dataTable.Columns.Count-1)
{
data += ",";
}
}
sw.WriteLine(data);
data = null;
for (int i = 0; i < dataTable.Rows.Count; i++)
{
for (int j = 0; j < dataTable.Columns.Count; j++)
{
data += dataTable.Rows[i][j].ToString();
if (j < dataTable.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
data = null;
}
sw.Close();
fs.Close();
}
}
CSV文件保存简易版本
StreamWriter sw = new StreamWriter(,Encoding.Default))
StringBuilder sb = new StringBuilder();
sb.Append("aa").Append(",").Append("bb").Append(",").Append("cc")
sw.WriteLine(sb);
sw.Close();
sw.Dispose();