文件流总结
文件流
一、文件操作常用的相关类(System.IO)
|
类名 |
作用 |
|
File |
静态类,对文件整体操作、拷贝、删除、剪切等 |
|
Directory |
静态类,操作目录(文件夹) |
|
DirectoryInfo |
文件夹的一个“类”,用来描述一个文件夹对象 |
|
FileInfo |
文件类,用来描述一个文件对象 |
|
Path |
对文件或目录的路径进行操作 |
|
Stream |
文件流,抽象类,FileStream 文件流,MemoryStream 内存流,NetworkStream 网络流,StreamReader 快读读取文本文件,StreamWriter 快速写入文本文件。 |
二、Path类
|
方法名 |
作用 |
|
ChangeExtension |
修改文件的后缀,Path.ChangeExtension(@”c:\temp\f3.png”,”jpg”) |
|
Combine |
将两个路径合并成一个路径,Path.Combine(@”c:\temp”,”a.jpg”) |
|
GetDiretoryName |
得到文件的路径名,Path.GetDirectoryName(@”c:\temp\a.jpg”) |
|
GetExtension |
得到文件的扩展名,Path.GetExtension(@”c:\temp\a.jpg”) |
|
GetFileName |
得到文件路径的文件名部分 |
|
GetFileNameWithoutExtension |
得到去除扩展名的文件名 |
|
GetFullPath |
得到文件的全路径,可根据相对路径得到绝对路径 |
|
Assmbly.GetExecutiongssembly().Location |
得到当前运行的程序集的路径 |
Demo1
protected void Page_Load(object sender, EventArgs e)
{
string strPath = @"c:\1\erweima.jpg";
Response.Write(Path.ChangeExtension(strPath, "png"));
Response.Write("</br>");
Response.Write(Path.Combine(@"c:\1", "1.jpg"));
Response.Write("</br>");
Response.Write(Path.GetDirectoryName(strPath));
Response.Write("</br>");
Response.Write(Path.GetExtension(strPath));
Response.Write("</br>");
Response.Write(Path.GetFileName(strPath));
Response.Write("</br>");
Response.Write(Path.GetFileNameWithoutExtension(strPath));
Response.Write("</br>");
Response.Write(Path.GetFullPath(strPath));
}
1 protected void Page_Load(object sender, EventArgs e)
2 {
3 string strPath = @"c:\1\erweima.jpg";
4 Response.Write(Path.ChangeExtension(strPath, "png"));
5 Response.Write("</br>");
6 Response.Write(Path.Combine(@"c:\1", "1.jpg"));
7 Response.Write("</br>");
8 Response.Write(Path.GetDirectoryName(strPath));
9 Response.Write("</br>");
10 Response.Write(Path.GetExtension(strPath));
11 Response.Write("</br>");
12 Response.Write(Path.GetFileName(strPath));
13 Response.Write("</br>");
14 Response.Write(Path.GetFileNameWithoutExtension(strPath));
15 Response.Write("</br>");
16 Response.Write(Path.GetFullPath(strPath));
17 }
三、File类
|
方法名 |
作用 |
|
Create |
创建制定的文件,如果文件存在则覆盖,File.Create(@:”c:\1.txt”) |
|
AppendAllText |
将制定的字符串追加到文本中,如果文件不存在,则创建该文件,File.AppendAllText(@“c:\1.txt”,”哈哈”) |
|
AppendAllLines |
在一个文件中追加文本行,如果文件不存在,则创建 |
|
Copy |
将现有文件复制到新文件 |
|
Delete |
删除指定的文件 |
|
Exists |
判断指定路径的文件是否存在 |
|
Move |
文件移动 |
|
ReadAllText |
读取文件所有行 |
|
ReadAllLines |
读取文本文档,返回字符串数组 |
|
WriteAllText |
写入制定的字符串 |
|
WriteAllLines |
写入指定的字符串数组 |
*编码(常用符号用哪些二进制表示)
ASCII,基于拉丁字母的一套电脑编码系统。
GB2312,对ASCII码扩展,追加了适用于汉字的一套电脑编码(适用于中国大陆,1981年实施)
GB18030,对GB2312扩展,追加了中国大陆少数民族文字的电脑编码。
BIG5,通行于台湾、香港地区的繁体字编码方案。
Unicode,为多个国家统一制定的一套电脑编码,以满足跨语言、跨平台的文本转换、处理的要求。4个字节表示一个字符,很浪费资源。
UTF-8,对Unicode升级,用一到四个字节表示一个字符,不同的语言就用不同的长度。
Demo2
protected void Page_Load(object sender, EventArgs e)
{
//using (File.Create(@"d:\1.txt"))//创建完后,释放资源,不然会报错。
//{ }
//File.Delete(@"d:\1.txt");
//File.Move(@"d:\1.txt", @"e:\1.txt");
//File.Copy(@"d:\1.txt", @"e:\1.txt",true);
//File.WriteAllText(@"d:\1.txt", "哈哈哈", Encoding.Default);//如果不指定Encoding.Default那么写入的编码和读取的编码不一致,会导致乱码
//List<string> list = new List<string> {"aaa","bbbb","ccccc","dddd" };
//File.WriteAllLines(@"d:\1.txt",list, Encoding.Default);
//File.AppendAllText(@"d:\1.txt", "eeeee", Encoding.Default);
//List<string> list = new List<string> {"eeee","ffff","gggg","eeee" };
//File.AppendAllLines(@"d:\1.txt", list, Encoding.Default);
//string strRead = File.ReadAllText(@"d:\1.txt");
//Response.Write(strRead);
//string[] arrStr = File.ReadAllLines(@"d:\1.txt");
//foreach (var s in arrStr)
//{
// Response.Write(s);
//}
}
1 protected void Page_Load(object sender, EventArgs e)
2 {
3 //using (File.Create(@"d:\1.txt"))//创建完后,释放资源,不然会报错。
4 //{ }
5 //File.Delete(@"d:\1.txt");
6 //File.Move(@"d:\1.txt", @"e:\1.txt");
7 //File.Copy(@"d:\1.txt", @"e:\1.txt",true);
8
9 //File.WriteAllText(@"d:\1.txt", "哈哈哈", Encoding.Default);//如果不指定Encoding.Default那么写入的编码和读取的编码不一致,会导致乱码
10 //List<string> list = new List<string> {"aaa","bbbb","ccccc","dddd" };
11 //File.WriteAllLines(@"d:\1.txt",list, Encoding.Default);
12
13 //File.AppendAllText(@"d:\1.txt", "eeeee", Encoding.Default);
14 //List<string> list = new List<string> {"eeee","ffff","gggg","eeee" };
15 //File.AppendAllLines(@"d:\1.txt", list, Encoding.Default);
16
17 //string strRead = File.ReadAllText(@"d:\1.txt");
18 //Response.Write(strRead);
19
20 //string[] arrStr = File.ReadAllLines(@"d:\1.txt");
21 //foreach (var s in arrStr)
22 //{
23 // Response.Write(s);
24 //}
25 }
四、Directory类
|
方法名 |
作用 |
|
CreateDirectory |
在指定路径创建所有目录和子目录 |
|
Delete |
删除目录 |
|
Exists |
路径是否存在 |
|
GetDirectories |
获取指定目录中的子目录的名称 |
|
GetFiles |
返回指定目录中文件的名称 |
|
GetFileSystemEntries |
返回指定目录中所有文件和子目录的名称 |
|
GetParent |
获取指定路径的父目录 |
|
Move |
将文件或目录及其内容移到新的位置 |
Demo3
protected void Page_Load(object sender, EventArgs e)
{
//Directory.CreateDirectory(@"e:\1\2");//创建目录
//Directory.Move(@"e:\source", @"e:\1\2");//源文件夹和目标文件夹要求存在于同一个硬盘分区中否则会操作失败,文件夹1必须存在
//Directory.Delete(@"e:\1",true);
//string[] arr= Directory.GetDirectories(@"e:\360Downloads");//获取指定目录中的子目录
//foreach (var s in arr)
//{
// Response.Write(s+"</br>");
//}
//string[] arr = Directory.GetFiles(@"E:\360Downloads\Apk");//获取指定目录下的文件目录
//foreach (var s in arr)
//{
// Response.Write(s + "</br>");
//}
//string[] arr = Directory.GetFileSystemEntries(@"E:\360Downloads");//返回指定目录中所有文件和子目录的名称
//foreach (var s in arr)
//{
// Response.Write(s + "</br>");
//}
}
1 protected void Page_Load(object sender, EventArgs e)
2 {
3 //Directory.CreateDirectory(@"e:\1\2");//创建目录
4 //Directory.Move(@"e:\source", @"e:\1\2");//源文件夹和目标文件夹要求存在于同一个硬盘分区中否则会操作失败,文件夹1必须存在
5 //Directory.Delete(@"e:\1",true);
6
7 //string[] arr= Directory.GetDirectories(@"e:\360Downloads");//获取指定目录中的子目录
8 //foreach (var s in arr)
9 //{
10 // Response.Write(s+"</br>");
11 //}
12
13 //string[] arr = Directory.GetFiles(@"E:\360Downloads\Apk");//获取指定目录下的文件目录
14 //foreach (var s in arr)
15 //{
16 // Response.Write(s + "</br>");
17 //}
18
19 //string[] arr = Directory.GetFileSystemEntries(@"E:\360Downloads");//返回指定目录中所有文件和子目录的名称
20 //foreach (var s in arr)
21 //{
22 // Response.Write(s + "</br>");
23 //}
24
25
26 }
五、DirectoryInfo类
是一个操作目录的实例类,提供了与静态类Directory类相同的方法,但是做了少部分扩展,当需要对目录进行多次操作的时候,最好是将该目录封装到实例对象中操作。
六、FileInfo类
是一个操作文件的实例类,提供了静态类File相同的方法,但是扩了扩展,如得到文件的大小等,当需要对文件进行多次操作的时候,最好是将文件封装到实例对象中操作。
Demo4
public partial class demo4 : System.Web.UI.Page
{
string path = @"F:\软谋\网站\ruanmou\web";
FileInfo info = null;
private StringBuilder sb = new StringBuilder();
public string GetRightPart()
{
string s = sb == null ? "" : sb.ToString();
return s;
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
SmartTreeView1.Nodes.Clear();
LoadTree(path);
}
}
protected void SmartTreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
string path = SmartTreeView1.SelectedNode.Target.ToString();
if (!string.IsNullOrEmpty(path))
{
string[] files = Directory.GetFiles(path);
sb.Append(@" <table class=""table table-bordered"" data-resizable-columns-id=""demo-table"">");
sb.Append(@"<tr>
<th data-resizable-column-id=""first_name"">文件名</th>
<th data-resizable-column-id=""last_name"">大小</th>
<th data-resizable-column-id=""username"" data-noresize>时间</th>
</tr>");
foreach (var file in files)
{
info = new FileInfo(file);
string sName = Path.GetFileName(file);
string sSize = info.Length.ToString();
string sCreateTime = info.CreationTime.ToString();
sb.Append(string.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>", sName, sSize, sCreateTime));
TreeNode node = new TreeNode();
node.Text = sName;
SmartTreeView1.SelectedNode.ChildNodes.Add(node);
}
sb.Append("</table>");
}
}
public void LoadTree(string path, TreeNode node=null)
{
string[] dirs = Directory.GetDirectories(path);
foreach (var dir in dirs)
{
TreeNode node1 = new TreeNode(Path.GetFileName(dir));
node1.Target = dir;
if (node == null)
{
SmartTreeView1.Nodes.Add(node1);
}
else
{
node.ChildNodes.Add(node1);
}
if (Directory.GetDirectories(dir).Length > 0)
{
LoadTree(dir, node1);//递归算法
}
}
}
}
1 public partial class demo4 : System.Web.UI.Page
2 {
3 string path = @"F:\软谋\网站\ruanmou\web";
4 FileInfo info = null;
5 private StringBuilder sb = new StringBuilder();
6 public string GetRightPart()
7 {
8 string s = sb == null ? "" : sb.ToString();
9 return s;
10 }
11 protected void Page_Load(object sender, EventArgs e)
12 {
13 if (!IsPostBack)
14 {
15 SmartTreeView1.Nodes.Clear();
16 LoadTree(path);
17 }
18 }
19
20 protected void SmartTreeView1_SelectedNodeChanged(object sender, EventArgs e)
21 {
22 string path = SmartTreeView1.SelectedNode.Target.ToString();
23 if (!string.IsNullOrEmpty(path))
24 {
25 string[] files = Directory.GetFiles(path);
26 sb.Append(@" <table class=""table table-bordered"" data-resizable-columns-id=""demo-table"">");
27 sb.Append(@"<tr>
28 <th data-resizable-column-id=""first_name"">文件名</th>
29 <th data-resizable-column-id=""last_name"">大小</th>
30 <th data-resizable-column-id=""username"" data-noresize>时间</th>
31 </tr>");
32 foreach (var file in files)
33 {
34 info = new FileInfo(file);
35 string sName = Path.GetFileName(file);
36 string sSize = info.Length.ToString();
37 string sCreateTime = info.CreationTime.ToString();
38 sb.Append(string.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>", sName, sSize, sCreateTime));
39 TreeNode node = new TreeNode();
40 node.Text = sName;
41 SmartTreeView1.SelectedNode.ChildNodes.Add(node);
42 }
43 sb.Append("</table>");
44 }
45 }
46
47 public void LoadTree(string path, TreeNode node=null)
48 {
49 string[] dirs = Directory.GetDirectories(path);
50 foreach (var dir in dirs)
51 {
52 TreeNode node1 = new TreeNode(Path.GetFileName(dir));
53 node1.Target = dir;
54 if (node == null)
55 {
56 SmartTreeView1.Nodes.Add(node1);
57 }
58 else
59 {
60 node.ChildNodes.Add(node1);
61 }
62 if (Directory.GetDirectories(dir).Length > 0)
63 {
64 LoadTree(dir, node1);//递归算法
65 }
66 }
67 }
68 }
七、Stream类
Demo5
/// <summary>
/// 读
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button1_Click(object sender, EventArgs e)
{
//读文件
//创建一个文件流对象
//using (FileStream stream = new FileStream(@"d:\2.txt", FileMode.Open))
//{
// //准备一个byte数组,以供文件流对象读取数据并放到这个数组里面
// byte[] buffer = new byte[1024 * 1024];//1m大小
// //调用文件流的读数据方法,将读出来的字节放到buffer数组中
// stream.Read(buffer, 0, buffer.Length);
// //将字节数组转成字符串
// string content = Encoding.Default.GetString(buffer);
// Response.Write(content);
//}
}
/// <summary>
/// 写
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button2_Click(object sender, EventArgs e)
{
//写文件
//创建文件流对象
using (FileStream stream = new FileStream(@"d:\2.doc", FileMode.Open))
{
//调用文件流写入的方法
string content = TextBox1.Text;
//将字符串以指定的编码转换为字节数组
byte[] buffer = Encoding.UTF8.GetBytes(content);
stream.Write(buffer, 0, buffer.Length);
}
}
/// <summary>
/// 大数据拷贝
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button3_Click(object sender, EventArgs e)
{
using (FileStream streamReader = new FileStream(@"d:\1.wmv", FileMode.Open))
{
using (FileStream streamWriter = new FileStream(@"e:\1.wmv", FileMode.Create))
{
byte[] data = new byte[1024 * 1024 * 2];//一次读两兆
int length = data.Length;
do
{
length = streamReader.Read(data, 0, data.Length);//此处的0表示它会按照上一次读取完的位置开始读,而不是又从头开始读,length表示实际读的长度
streamWriter.Write(data, 0, length);
}
while (length == data.Length);
}
}
}
1 /// <summary>
2 /// 读
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 protected void Button1_Click(object sender, EventArgs e)
7 {
8 //读文件
9 //创建一个文件流对象
10 //using (FileStream stream = new FileStream(@"d:\2.txt", FileMode.Open))
11 //{
12 // //准备一个byte数组,以供文件流对象读取数据并放到这个数组里面
13 // byte[] buffer = new byte[1024 * 1024];//1m大小
14 // //调用文件流的读数据方法,将读出来的字节放到buffer数组中
15 // stream.Read(buffer, 0, buffer.Length);
16 // //将字节数组转成字符串
17 // string content = Encoding.Default.GetString(buffer);
18 // Response.Write(content);
19 //}
20 }
21
22 /// <summary>
23 /// 写
24 /// </summary>
25 /// <param name="sender"></param>
26 /// <param name="e"></param>
27 protected void Button2_Click(object sender, EventArgs e)
28 {
29 //写文件
30 //创建文件流对象
31 using (FileStream stream = new FileStream(@"d:\2.doc", FileMode.Open))
32 {
33 //调用文件流写入的方法
34 string content = TextBox1.Text;
35 //将字符串以指定的编码转换为字节数组
36 byte[] buffer = Encoding.UTF8.GetBytes(content);
37 stream.Write(buffer, 0, buffer.Length);
38 }
39 }
40
41 /// <summary>
42 /// 大数据拷贝
43 /// </summary>
44 /// <param name="sender"></param>
45 /// <param name="e"></param>
46 protected void Button3_Click(object sender, EventArgs e)
47 {
48 using (FileStream streamReader = new FileStream(@"d:\1.wmv", FileMode.Open))
49 {
50 using (FileStream streamWriter = new FileStream(@"e:\1.wmv", FileMode.Create))
51 {
52 byte[] data = new byte[1024 * 1024 * 2];//一次读两兆
53 int length = data.Length;
54 do
55 {
56 length = streamReader.Read(data, 0, data.Length);//此处的0表示它会按照上一次读取完的位置开始读,而不是又从头开始读,length表示实际读的长度
57 streamWriter.Write(data, 0, length);
58 }
59 while (length == data.Length);
60 }
61 }
62 }
八、using
1、如果一个对象要被using管理,这个对象的类必须实现IDisposeable接口。
2、using本质其实就是一个try-finally,将using中的代码生成在try中,Dispose方法写在finally中,所以Dispose方法无论如何都会调用。
------------------------------------------------------------------------------------------------------------------------------------------


浙公网安备 33010602011771号