C#文件操作:
文件操作的头文件为System .IO
1、File和fileinfo
file通过静态方法实现,而fileinfo类则通过实例方法实现。Append创建一个streamwrite类型,用于追加文本
2、Create指定文件夹下创建或者覆盖文件
3、Delete删除指定文件
4、Exists检查文件是不是存在
5、Open 制定特有的读写权限打开文件
6、OpenRead 以读取的方式打开现有文件
7、OpenWrite打开或者创建一个现有文件,以写入文件
8、ReadAllText 读取文件的所有行,然后关闭文件
9、WriteAllText写入指定的字符串,然后关闭文件
10.File.AppendAllText(@“D:\Test\Debug1\测试.txt”,“哈哈”);在文件后追加一个字符串
File.Delete(@“G:\456.txt”);//删除文件,括号内为文件的路径
File.Move(@“g:\123.txt”, @“g:\vs2\223.txt”);//(剪切)文件移动路径,第一个变量为需要移动的,第二个为你移动到的位置并且得声明移动后文本文件的名字
File.Copy(@“g:\vs2\223.txt”, @“g:\网页设计\223.txt”);//文件的拷贝自动新建文件俩个参数为路径
属性或方法 | 作用 |
---|---|
DateTime GetCreationTime(string path) | 返回指定文件或目录的创建日期和时间 |
DateTime GetLastAccessTime(string path) | 返回上次访问指定文件或目录的日期和时间 |
DateTime GetLastWriteTime(string path) | 返回上次写入指定文件或目录的日期和时间 |
void SetCreationTime(string path, DateTime creationTime) | 设置创建该文件的日期和时间 |
void SetLastAccessTime(string path, DateTime lastAccessTime) | 设置上次访问指定文件的日期和时间 |
void SetLastWriteTime(string path, DateTime lastWriteTime) | 设置上次写入指定文件的日期和时间 |
文件流stream使用:
流可以理解为内存中字节序列,stream是所有流的抽象基类,每个具体的存储实体都可以 通过stream派生类来实现。如FileStream就是这种储存实体
三个基本操作
1、对流进行读取:将流中的数据读取到具体的数据结构中
2、对流进行写入:吧数据结构中的数据写入到流中
3、对流进行查找:对流内的当前位置进行查询和修改
使用流处理文件
流是一个用于传输数据的对象,数据可以向两个方向传输:
1)如果数据从外部源传输到程序中,这就是读取流
2)如果数据从程序传输到外部源中,这就是写入流
外部源往往是一个文件,但也不完全是文件,他还可能是:
1)使用一些网络协议读写网络上的数据,其目的是选择数据,或从另一个计算机上发送数据
2)读写到命名管道上
3)把数据读写到一个内存区域上
FileStream实例用于读写文件中的数据,要构造FileStream实例,需要以下4条信息:
1)要访问的文件
2)表示如何打开文件的模式
3)表示文件访问的方式—只读、只写还是读写
4)共享访问—表示是否独占访问文件
FileStream常用的属性和方法:
属性:
CanRead 判断当前流是否支持读取,返回bool值,True表示可以读取
CanWrite 判断当前流是否支持写入,返回bool值,True表示可以写入
方法:
Read() 从流中读取数据,返回字节数组
Write() 将字节块(字节数组)写入该流
Seek() 设置文件读取或写入的起始位置
Flush() 清除该流缓冲区,使得所有缓冲的数据都被写入到文件中
Close() 关闭当前流并释放与之相关联的所有系统资源
文件的访问方式:(FileAccess)
包括三个枚举:
FileAccess.Read(对文件读访问)
FileAccess.Write(对文件进行写操作)
FileAccess.ReadWrite(对文件读或写操作)
文件打开模式:(FileMode)包括6个枚举
FileMode.Append 打开现有文件准备向文件追加数据,只能同FileAccess.Write一起使用
FileMode.Create 指示操作系统应创建新文件,如果文件已经存在,它将被覆盖
FileMode.CreateNew 指示操作系统应创建新文件,如果文件已经存在,将引发异常
FileMode.Open 指示操作系统应打开现有文件,打开的能力取决于FileAccess所指定的值
FileMode.OpenOrCreate 指示操作系统应打开文件,如果文件不存在则创建新文件
FileMode.Truncate 指示操作系统应打开现有文件,并且清空文件内容
文件共享方式:(FileShare)
FileShare方式是为了避免几个程序同时访问同一个文件会造成异常的情况。
文件共享方式包括四个:
FileShare.None 谢绝共享当前文件
FileShare.Read 充许别的程序读取当前文件
FileShare.Write 充许别的程序写当前文件
FileShare.ReadWrite 充许别的程序读写当前文件
使用FileStream类创建文件流对象:
FileStream(String 文件路径,FileMode 文件打开模式)
FileStream(String 文件路径,FileMode 文件打开模式,FileAccess 文件访问方式)
FileStream(String 文件路径,FileMode 文件打开模式,FileAccess 文件访问方式,FileShare 文件共享方式)
例:
//在C盘创建a.txt文件,使用fs流对象对文件进行操作,fs的工作模式是新建(FileMode.Create)
FileStream fs=new FileStream(@“c:a.txt”,FileMode.Create);
//在C盘创建a.txt文件,使用fs流对象对文件进行操作,fs工作模式是新建(FileMode.Create)文件的访问模式是写入(Fileaccess.Write)
FileStream fs=new FileStream(@“c:a.txt”,FileMode.Create,FileAccess.Write);
//在C盘创建a.txt文件,使用fs流对象对文件进行操作,fs工作模式是新建(FileMode.Create)文件的访问模式是写入(FileAccess.Write)文件的共享模式是谢绝共享(FileShare.None)
FileStream fs=new FileStream(@“c:a.txt”,FileMode.Create,FileAccess.Write,FileShare.None);
使用File类来创建文件流对象:(常用)
自定义打开文件的方式:File.Open(String,FileMode);
打开文件进行读取: File.OpenRead(String);
打开文件进行写入: File.OpenWrite(String);
对文件的读写操多不管代码有多少,无非就是下面的三步:
1.创建文件读写流对象
2.对文件进行读写
3.关闭文件流
使用实例(摘自—家庭财务管理 源码):
/// <summary>
/// 获取数据
/// </summary>
private void GetData()
{
List<ShouZhi> ulist = new List<ShouZhi>();
using (FileStream fs = new FileStream("ShouZhi.txt", FileMode.Open, FileAccess.Read))
{
using (StreamReader zs = new StreamReader(fs, Encoding.UTF8))
{
while (!zs.EndOfStream)//判断是否读取到流的末尾
{
string str = zs.ReadLine();//读取一行
ShouZhi s = new ShouZhi();
string[] strm = str.Split('#');//以#字符分隔数据
s.id = int.Parse(strm[0]);
s.name = strm[1];
s.type = strm[2];
ulist.Add(s);
}
}
}
this.dgvSz.DataSource = ulist;
this.dgvSz.SelectionMode = DataGridViewSelectionMode.FullRowSelect;//整行选择
this.dgvSz.MultiSelect = false;//不允许多行选
}
//------
//删除
private void toolStripButton2_Click(object sender, EventArgs e)
{
if (this.dgvSz.SelectedRows.Count == 0) { return; }
int index = this.dgvSz.SelectedRows[0].Index;//获取选择行的索引
List<ShouZhi> ulist = this.dgvSz.DataSource as List<ShouZhi>;
ulist.RemoveAt(index);
//先清空,再重新写入
FileStream fs = new FileStream("ShouZhi.txt", FileMode.Truncate, FileAccess.Write);//创建文件流
StreamWriter zs = new StreamWriter(fs, Encoding.UTF8);
foreach (ShouZhi item in ulist)
{
string str = item.id + "#" + item.name + "#" + item.type;//拼接
zs.WriteLine(str);
}
zs.Close();
fs.Close();
GetData();
}
//----------
//修改
private void toolStripButton3_Click(object sender, EventArgs e)
{
if (this.dgvSz.SelectedRows.Count == 0) { return; }
//编辑//获取选中行
int index = this.dgvSz.SelectedRows[0].Index;
List<ShouZhi> ulist = (List<ShouZhi>)this.dgvSz.DataSource;
ShouZhi sz = ulist[index];//获取集合实中实体对象
frmAdd add = new frmAdd();
add.ShouZhi = sz;
DialogResult dr = add.ShowDialog();
if (dr == DialogResult.OK)
{
//对已经更新的实体变更数据(更新数据集合)
sz.id = add.ShouZhi.id;
sz.name = add.ShouZhi.name;
sz.type = add.ShouZhi.type;
//将更新后的数据集合重新写入文件
FileStream fs = new FileStream("ShouZhi.txt", FileMode.Truncate, FileAccess.Write);
StreamWriter zs = new StreamWriter(fs, Encoding.UTF8);
foreach (ShouZhi item in ulist)
{
string str = item.id + "#" + item.name + "#" + item.type;
zs.WriteLine(str);
}
zs.Close();
fs.Close();
GetData();
}
}