(一)基本类
1.IO


2.Path

public static void PathOperation()
{
string path1 = @"C:\Users\xh725";
string path2 = @"Desktop\1.txt";
string newPath1 = Path.ChangeExtension(path2, "doc");//2.doc
string newPath2 = Path.Combine(path1, path2);
string ext = Path.GetExtension(path2);//包含点 .txt
string fileName1 = Path.GetFileName(path2);//1.txt
string fileName2 = Path.GetFileNameWithoutExtension(path2);//1
bool bl = Path.HasExtension(path1); //fasle
string path3 = Path.GetFullPath(newPath2);//绝对路径
//如果传入一个相对地址默认以当前程序启动位置为目录
}
3.Directory

public static void DirectoryOperation()
{
string path= @"C:\Users\xh725\Desktop\test\test01\001";
string path2= @"C:\Users\xh725\Desktop\test\test02\001";
if(!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
Directory.Delete(path, true);//布尔参数表示是否递归删除其子目录
Directory.Move(path, path2);
string path3 = @"C:\Users\xh725\Desktop\test";
//目录列表
string[] dics=Directory.GetDirectories(path3);
string path4 = @"C:\Users\xh725\Desktop\test\test02\001";
//目录下文件列表
string[] files=Directory.GetFiles(path4);
}
递归获取子目录和文件
/// <summary>
/// 递归获取子目录和文件
/// </summary>
/// <param name="path"></param>
/// <param name="dictList"></param>
public static void GeChildDirectoriesAndFiles(string path,List<string> dictList)
{
DirectoryInfo dict=new DirectoryInfo(path);
DirectoryInfo[] dicts=dict.GetDirectories();
FileInfo[] files=dict.GetFiles();
dictList.AddRange(files.Select(f=>f.FullName));
foreach(var dic in dicts)
{
dictList.Add(dic.FullName);
GeChildDirectoriesAndFiles(dic.FullName, dictList);
}
}
4. File文件操作
创建/删除/复制/移动/追加

复制移动时path4不能已存在
追加文本 已存在,追加,不存在,创建

打开/读取/写入



5.stream
流的抽象概念: 在计算机系统中,流是一种抽象概念,用于表示数据在设备之间的传输。流可以是字节流或字符流,用于处理不同类型的数据。
- 缓冲区: 流通常会使用缓冲区来存储数据。当数据从输入设备流向输出设备时,数据会被存储在缓冲区中,然后逐步传输到目标设备。
- 数据传输: 流在底层通过读取和写入字节序列的方式来传输数据。在操作系统层面,流会调用底层的 I/O 系统调用来实现数据的传输。
- 文件流: 在文件 I/O 操作中,文件流是一种常见的流类型。文件流通过读取和写入文件字节来实现文件的操作,底层会将数据传输到文件系统中。
- 内存流: 内存流是另一种常见的流类型,用于在内存中进行数据的读写操作。底层实现会在内存中创建缓冲区,将数据存储在内存中进行传输。
- 流的类型转换: 在底层实现中,流可能需要进行类型转换,比如将字符流转换为字节流或反之。
- 底层文件系统: 流的读写操作涉及到底层文件系统的工作机制,例如磁盘 I/O 操作、文件系统缓存等。




流在处理数据时效率高的原因
- 缓冲区:流通常使用缓冲区来临时存储数据,而不是每次读取或写入数据都直接访问设备。通过使用缓冲区,可以减少对设备的直接访问次数,从而提高效率。
- 批量读写:流支持批量读写操作,可以一次性读取或写入多个数据块,减少读写操作的次数,提高数据的处理效率。
- 流水线处理:流可以实现流水线处理,即在读取或写入数据的同时进行其他操作。这种并行处理方式有助于提高整体的效率。
- 异步操作:一些流支持异步操作,可以在读写数据的同时进行其他任务,不会阻塞线程,提高系统的并发性能。
- 数据处理抽象:流提供了一种统一的数据处理抽象,不需要关心底层的具体实现细节。这种抽象可以降低代码的复杂度,提高开发效率。
- 底层优化:流的实现通常经过优化,能够充分利用底层系统资源和硬件设备,提高数据处理的效率。
总的来说,流在处理数据时效率高的关键在于其使用了缓冲区、支持批量读写、流水线处理和异步操作等技术,在设计上实现了对底层系统的高效利用。开发人员在进行数据处理时,可以充分利用流的优势来提高系统性能和响应速度。
5.1 streamwriter
用using和手动关闭资源的区别
在C#中,使用 using 语句和手动关闭资源(如调用对象的 Close() 或 Dispose() 方法)来释放资源之间有以下区别:
- 自动资源释放:
使用 using 语句可以确保资源在使用完毕后自动释放。using 语句会在代码块结束时调用资源对象的 Dispose() 方法,即使在发生异常的情况下也会释放资源,避免资源泄漏。
手动关闭资源需要开发者显式调用资源对象的 Close() 或 Dispose() 方法来释放资源,容易出现遗漏或忘记释放资源的情况。
- 代码简洁性和可读性:
使用 using 语句简化了资源释放的代码,使代码更加简洁和易读。通过将资源的生命周期与代码块的生命周期对应,可以提高代码的可维护性。
手动关闭资源的方式会在每个需要释放资源的地方编写释放资源的代码,代码重复度高,降低代码可读性。
异常处理:
使用 using 语句时,即使发生异常也会执行资源释放操作,确保资源被正确释放,提高了程序的健壮性。
手动关闭资源时,需要额外处理异常情况下的资源释放。如果在资源释放前发生了异常且未被捕获,可能导致资源未能正确释放。
性能:
- 从性能的角度来看,使用 using 语句和手动关闭资源的区别不大。但是 using 语句更为简洁清晰,并且存在自动异常处理,因此更受推荐。

reader.Read():
- Read() 方法用于从流中读取下一个字符,并返回它的 ASCII 值(整数表示)。
- 每次调用 Read() 方法,流的读取位置都会向前移动一个字符。
- 如果流的末尾已经被读取到,Read() 方法会返回 -1。
reader.Peek():
- Peek() 方法用于查看流中下一个字符,但不移动读取位置。
- Peek() 方法返回下一个字符的 ASCII 值,但不改变读取位置。
- 如果流的末尾已经被读取到,Peek() 方法会返回 -1。
- 在使用 Peek() 方法时,需要根据返回值进行判定是否是流的末尾,防止进入死循环。
5.2 streamwriter

组合使用,因为可能文件很大,可以边读边写




浙公网安备 33010602011771号