文件流总结

文件流

一、文件操作常用的相关类(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方法无论如何都会调用。

------------------------------------------------------------------------------------------------------------------------------------------

posted @ 2015-03-09 13:43  一生的爱恋  阅读(108)  评论(0)    收藏  举报