# 流操作
- File 操作文件,对文件整体操作,拷贝、删除和剪切等。(静态)
- FileInfo 文件类,用来描述一个文件对象 (动态)
- Directory 操作目录 (静态)
- DirectoryInfo 操作目录 文件夹一个类,获取指定目录下的所有文件,返回一个FileInfo数组 (动态)
- Path 对文件或者目录操作
- Stream
- FileStream //文件流
- MenoryStream //内存流
- NetWorkStream //网络流
- StreamReader //快速读取文本文件
- StreamWriter //快速写入文本文件
- GZipStream
# 1.File
读取文件
# 2.FileInfo
获取文件信息
# 3.Directory
- 创建文件夹,如果已有便不创建
- 删除文件,如果文件夹下还有文件则报异常
- 删除文件,如果目录不存在则报异常
- 剪切不能跨磁盘
- 剪切不能取已有名称的文件夹
- 子文件和子目录只能包含在直接子目录
# 4.DirectoryInfo
获取文件夹信息 获取文件加下的DirectoryInfo和FileInfo
# 5.Path
获取文件目录,对文件目录的操作
# 6.Stream
# 1.FileStream
读取文件:
//文件流:读取
FileStream fileStream = File.Open(@"D:\test.txt", FileMode.Open);//初始化文件流
byte[] array = new byte[fileStream.Length];//初始化字节数组,用来暂存读取到的字节
fileStream.Read(array, 0, array.Length);//读取流中数据,写入到字节数组中
fileStream.Close(); //关闭流
string str = Encoding.Default.GetString(array);//将字节数组内容转化为字符串
Response.Write(str);
写入文件:
//文件流:写入
FileStream fileStream = File.Open(@"D:\test.txt",FileMode.Append);//初始化文件流
byte[] array = Encoding.Default.GetBytes("哈哈123abc");//给字节数组赋值
fileStream.Write(array, 0, array.Length);//将字节数组写入文件流
fileStream.Close();//关闭流
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 2.MenoryStream
string str = "Hi!你好!";
byte[] array = Encoding.UTF8.GetBytes(str);//将字符串转化为字节数组
MemoryStream memory = new MemoryStream(array);//初始化MemoryStream类
byte[] arrayNew = memory.ToArray();//将内存中的数据转换为字节数组
string strNew = Encoding.UTF8.GetString(arrayNew);//将字节数组转换为字符串
1
2
3
4
5
2
3
4
5
# 3.NetWorkStream
服务器
TcpListener lis=new TcpListener(5000); //服务器监听
lis.Start();//启动
Socket sock=lis.AcceptSocket();//阻塞,直到有客户端连接
NetworkStream networkStream = new NetworkStream(sock);//得到Socket中的流
if (netStream.DataAvailable) //如果客户端发送了消息
{
byte[] data = new byte[1024]; //定义一个字节数组,用来存放接收的数据
int len = netStream.Read(data, 0, data.Length); //从位置开始,读取到字节数组末尾
string line = Encoding.Default.GetString(data, 0, len); //把收到的字节转换为字符串
}
客户端
TcpClient client = new TcpClient();//客户端tcp对象
client.Connect("127.0.0.1", 5000);//连接服务器
NetworkStream myStream = client.GetStream();//得到网络流
byte[] data = Encoding.Default.GetBytes("Hi,你好"); //首先把输入的字符串消息转换为字节
myStream .Write(data, 0, data.Length); //向myStream 里写入数据
myStream .Flush(); //刷新流中的数据
myStream .Close();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# StreamReader/StreamWriter
StreamReader/StreamWriter主要用来处理流数据。它们分别提供了高效的流读取/写入功能。
//StreamReader 读取
StreamReader reader = new StreamReader(@"D:\test.txt",Encoding.Default);//初始化读取 设置编码格式,否则中文会乱码
string readStr = reader.ReadLine();//从流中读取一行 reader.ReadToEnd()读取全部
reader.Close();//关闭流
//StreamWriter 写入
StreamWriter writer = new StreamWriter(@"D:\test1.txt");//初始化写入
writer.WriteLine("Hi 你好123");//写入一行
writer.Close();
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# TextReader/TextWriter
TextReader/TextWriter类主要用来处理流数据。它们分别提供了高效的文本流读取/写入功能。
//TextReader/Writer读写
TextReader textReader = new StringReader("Hi 你好");//初始化读取流
TextWriter textWriter = new StringWriter();//初始化写入流
char[] c=new char[4096];
int chars = 0;
while ((chars = textReader.Read(c, 0, 4096)) > 0)//把流中数据写入到字符数组中 读取流中数据
{
textWriter.Write(c, 0, 4096);//从字符数组中读取流
}
string str= textWriter.ToString();//将流中数据写到字符串中
textReader.Close();//关闭流
textWriter.Close();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# GZipStream
压缩流 GZipstream
压缩原理: 1.图片 2.文本文件 3.电影 4.字符串
1.压缩:
1.创建读取流 FIle.OpenRead()
2.创建写入流 FIle.Openwrite()
3.创建压缩流 new GZipstream()将写入流作为参数与.
4.每次通过读取流读取一部分数据,通过压缩流写入.
2.解压
1.创建读取流: FIle . OpenRead()
2.创建压缩流: new Gzipstream():将读取流作为参数
3.创建写入流 File . Openwrite();
4.每次通过压缩流读取数据,通过写入流写入数据。
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 注意事项:
- ==流使用后必须要关闭。==
- ==把流中数据加载到内存时要考虑内存溢出等问题。== 1.== 一个流只能针对一个对象==
1.文件流操作的都是字节,不能是字符串
//创建文件流
filestream fs=new filestream("xx.text",filemode.create,fileaccess.write)
//执行写入
string msg=“123456789”;
byte[] bytes=system.text.utf8.getbytes(msg);
fs.write(bytes,0,bytes.length);
//清空缓冲区,关闭文件流,释放资源
fs.Flush();
fs.Close();
fs.Dispose();
using=dispose
//使用文件流时不需要指定编码,应为编码是在btye[]转字符串是才使用的,这里是直接读到byte
using(filestream fs=new filestream("xx.text",filemode.open,fileaccess.read))
{
//根据文件总数组创建一个byte数组,这种方式将文件一次性读取出来
byte[] bytes=new byte(fs.length)
fs.read(bytes,0,bytes.length);
//byte转string 要编码
string msg=system.text.utf8.getstring(bytes)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 乱码
文本文件:直接保存字符串
ASCII ==> gb2312==> GBK(简体中文编码)==>GB18030
8位==>8位: +7英文 16位::-7-7中文==>8位: +7英文 16位::-7 8中文
big5繁体
unicode:国际码 中英文都是2个字节
UTF-8:国际码 英文1个字节 中文3个字节
Encoding.getencoding()所有编码
读取和保存时用同一编码,避免乱码
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 垃圾回收
# 垃圾回收
CG.collect() 三代参数
mark-and-compac标记与压缩
# 析构函数
~myclass() 在垃圾回收时才回收这个类开辟内存
非托管代码开辟的空间要立即释放
class myclass:IDisposable
{
~myclass()
public void Dispose()
{}
}
Dispose和Finalize。Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。
//对所有代进行垃圾回收。
GC.Collect();
//对指定的代进行垃圾回收。
GC.Collect(int generation);
//强制在 System.GCCollectionMode 值所指定的时间对零代到指定代进行垃圾回收。
GC.Collect(int generation, GCCollectionMode mode);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# dispose的具体使用
1.继承IDisposable的方法
class Person : IDisposable
{
#region IDisposable Support
private bool disposedValue = false; // 要检测冗余调用
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: 释放托管状态(托管对象)。
}
// TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结。
// TODO: 将大型字段设置为 null。
disposedValue = true;
}
}
// TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
// ~Person() {
// // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
// Dispose(false);
// }
// 添加此代码以正确实现可处置模式。
public void Dispose()
{
// 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
Dispose(true);
// TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
// GC.SuppressFinalize(this);
}
#endregion
}
2.对他改写一下可以更加了解
class Person : IDisposable
{
//演示创建一个非托管资源
private IntPtr nativeResource = Marshal.AllocHGlobal(100);
//演示创建一个托管资源
private PersonInfo personInfo = new PersonInfo();
#region IDisposable Support
private bool disposedValue = false; // 要检测冗余调用
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: 释放托管状态(托管对象)。
personInfo.Dispose();
personInfo = null;
}
if (nativeResource != IntPtr.Zero)
{
Marshal.FreeHGlobal(nativeResource);
nativeResource = IntPtr.Zero;
}
// TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
// TODO: 将大型字段设置为 null。
disposedValue = true;
}
}
// TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
// ~Person() {
// // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
// Dispose(false);
// }
// 添加此代码以正确实现可处置模式。
public void Dispose()
{
// 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
Dispose(true);
// TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
GC.SuppressFinalize(this);
}
/// <summary>
/// 不是必要的,提供一个Close方法仅仅是为了更符合其他语言(如C++)的规范
/// </summary>
public void Close()
{
Dispose();
}
~Person()
{
//必须为false
Dispose(false);
}
#endregion
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101