No title
No title
John Doe文件操作(I/O)
Path类,File类
Path 类(静态)
Path 类提供了一系列静态方法,用于处理文件路径字符串。它并不直接操作文件,而是用于路径的格式化、解析和验证。
常用方法
Combine(string path1, string path2):将两个路径字符串合并成一个路径。
1
string combinedPath = Path.Combine("C:\\example", "myfile.txt");
GetExtension(string path):获取指定路径的扩展名。
1
string extension = Path.GetExtension("C:\\example\\myfile.txt"); // .txt
GetFileName(string path):获取指定路径的文件名(不包含路径)。
1
string fileName = Path.GetFileName("C:\\example\\myfile.txt"); // myfile.txt
GetDirectoryName(string path):获取指定路径的目录部分。
1
string directoryName = Path.GetDirectoryName("C:\\example\\myfile.txt"); // C:\example
GetFullPath(string path):获取指定路径的绝对路径。
1
string fullPath = Path.GetFullPath("myfile.txt"); // 绝对路径
ChangeExtension(string path, string extension):更改指定路径的文件扩展名。
1
string newPath = Path.ChangeExtension("C:\\example\\myfile.txt", ".md"); // C:\example\myfile.md
HasExtension(string path):判断路径是否具有扩展名。
1
bool hasExtension = Path.HasExtension("C:\\example\\myfile.txt"); // true
获取文件扩展名
Console.WriteLine(Path.GetExtension(str));
获得文件地址
Console.WriteLine(Path.GetDirectoryName(str));
连接两个字符串作为路径
Console.WriteLine(Path.Combine(@"a\b\c\","djaoi.txt"));
File 类(静态)
File 类提供了一系列静态方法,用于创建、删除、复制、移动和打开文件。它直接操作文件系统中的文件,封装了底层的文件操作功能。
主要功能
- 文件创建:创建新文件或覆盖现有文件。
- 文件删除:删除指定的文件。
- 文件复制:复制文件到新的位置。
- 文件移动:移动文件到新的位置。
- 文件属性:获取或设置文件的属性信息,如大小、创建时间等。
常用方法
Create(string path):创建一个新的文件。文件如果已存在则覆盖。
1
2
3
4using (FileStream fs = File.Create("C:\\example\\myfile.txt"))
{
// 文件创建成功
}Delete(string path):删除指定的文件。
1
File.Delete("C:\\example\\myfile.txt");
Copy(string sourceFileName, string destFileName):复制文件到新位置。
1
File.Copy("C:\\example\\sourcefile.txt", "C:\\example\\destfile.txt");
Move(string sourceFileName, string destFileName):移动文件到新位置。
1
File.Move("C:\\example\\sourcefile.txt", "C:\\example\\destfile.txt");
Exists(string path):判断文件是否存在。
1
bool fileExists = File.Exists("C:\\example\\myfile.txt");
ReadAllText(string path):读取文件的所有文本内容。
1
string content = File.ReadAllText("C:\\example\\myfile.txt");
WriteAllText(string path, string contents):将文本内容写入文件。
1
File.WriteAllText("C:\\example\\myfile.txt", "Hello, world!");
ReadAllBytes(string path):读取文件的所有字节内容。
1
byte[] bytes = File.ReadAllBytes("C:\\example\\myfile.txt");
WriteAllBytes(string path, byte[] bytes):将字节数据写入文件。
1
File.WriteAllBytes("C:\\example\\myfile.txt", bytes);
创建一个文件
File.Create(@"C:\Users\31595\Desktop\old.txt");
删除一个文件
File.Delete(@"C:\Users\31595\Desktop\hhhh.txt");
复制一个文件
File.Copy(@"C:\Users\31595\Desktop\old.txt", @"C:\Users\31595\Desktop\new.txt");
写入文件
1 | string str = "今天是个好天气"; |
读取文件
1 | //按行读取,返回的是字符串数组 |
Directory(目录)
Directory 是 .NET 中用于处理目录(文件夹)的静态类,属于 System.IO 命名空间。
1. 特性
- 静态方法:所有的方法都是静态的,直接通过类名调用。
- 简化操作:适用于执行简单的目录操作,无需创建对象实例。
- 性能:与
DirectoryInfo类相比,静态方法提供了一种简洁的方式来处理目录操作,但不具备面向对象的特性。
2. 常用方法
- **
CreateDirectory(string path)**:创建指定路径的目录。如果目录已存在,则返回现有目录。 - **
Delete(string path, bool recursive)**:删除指定路径的目录。可以选择是否递归删除目录及其内容。 - **
Exists(string path)**:检查指定路径的目录是否存在。 - **
GetFiles(string path)**:获取指定目录中的文件列表。 - **
GetDirectories(string path)**:获取指定目录中的子目录列表。 - **
GetFileSystemEntries(string path)**:获取指定目录中的文件和子目录列表。 - **
Move(string sourceDirName, string destDirName)**:将目录从一个位置移动到另一个位置。
绝对路径和相对路径
**绝对路径:**通过给定的这个路径能直接在电脑上找到文件.
**相对路径:**文件相对于应用程序的路径
结论:
我们在开发中应尽量使用相对路径
FileStream类(读写)
1. 特性
- 字节流访问:
FileStream处理的是原始字节流,可以读取或写入任意类型的数据。 - 同步和异步:支持同步和异步操作,适用于不同的性能需求。
- 文件操作:提供了直接对文件的流式读写操作,比
File和StreamReader/StreamWriter更底层。 - 使用方法:不是静态类,需要实例化才能使用
2. 常用构造函数
- **
FileStream(string path, FileMode mode)**:以指定的模式打开文件。 - **
FileStream(string path, FileMode mode, FileAccess access)**:以指定的模式和访问权限打开文件。 - **
FileStream(string path, FileMode mode, FileAccess access, FileShare share)**:以指定的模式、访问权限和共享方式打开文件。 - **
FileStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize)**:指定缓冲区大小来打开文件。
3. 常用属性
- **
CanRead**:获取一个值,指示当前FileStream是否支持读取。 - **
CanWrite**:获取一个值,指示当前FileStream是否支持写入。 - **
Length**:获取文件的长度(以字节为单位)。 - **
Position**:获取或设置当前流的位置。 - **
ReadTimeout**:获取或设置读取操作的超时时间。 - **
WriteTimeout**:获取或设置写入操作的超时时间。
4. 常用方法
- **
Read(byte[] buffer, int offset, int count)**:从流中读取字节数据到缓冲区。 - **
Write(byte[] buffer, int offset, int count)**:将缓冲区的字节数据写入到流中。 - **
Seek(long offset, SeekOrigin origin)**:移动流的位置到指定的偏移量。 - **
Flush()**:刷新缓冲区,将所有缓冲数据写入文件。 - **
SetLength(long value)**:设置流的长度。 - **
Close()**:关闭FileStream并释放与文件关联的所有资源。 - **
Dispose()**:释放FileStream占用的所有资源(通常通过using语句自动调用)。
FileMode和FileAccess
1. FileMode 枚举
FileMode 枚举定义了在打开或创建文件时的行为。它决定了文件如何被处理。常用的 FileMode 值包括:
- **
Create**:指定如果文件不存在,则创建新文件。如果文件存在,则覆盖它。此模式下会清空现有文件的内容。 - **
CreateNew**:指定如果文件不存在,则创建新文件。如果文件已经存在,则引发IOException。 - **
Open**:指定打开现有文件。文件必须存在,否则引发FileNotFoundException。 - **
OpenOrCreate**:指定如果文件存在,则打开它。如果文件不存在,则创建新文件。 - **
Truncate**:指定打开现有文件。文件必须存在。该文件的长度将被截断为零字节。 - **
Append**:指定打开文件并将其内容追加到文件末尾。如果文件不存在,则创建新文件。
2. FileAccess 枚举
FileAccess 枚举定义了对文件的访问权限。它指定了你对文件的操作权限,包括读取、写入或两者皆有:
- **
Read**:指定文件只能进行读取操作。 - **
Write**:指定文件只能进行写入操作。 - **
ReadWrite**:指定文件可以进行读取和写入操作。
3. 示例
读取文件内容
1 | string filePath = @"C:\example\myfile.txt"; |
写入文件内容
1 | string filePath = @"C:\example\myfile.txt"; |
异步操作
1 | string filePath = @"C:\example\myfile.txt"; |
1 | //使用FileStream类读取数据 |
将创建文件流对象的过程写在using中,会自动帮我们释放流所占用的资源.
1 | using (FileStream fsWrite = new FileStream(@"C:\Users\31595\Desktop\new.txt",FileMode.OpenOrCreate,FileAccess.ReadWrite)) |
FileInfo(对文件操作)和DirectoryInfo(对目录操作)
FileInfo类
1. 特性
- 文件信息:可以获取文件的各种属性,如文件名、路径、创建时间、修改时间等。
- 文件操作:提供了创建、删除、复制、移动等文件操作的功能。
- 对象导向:与
File类(静态方法)相比,**FileInfo类是面向对象的**,它允许你创建文件对象,然后调用方法来执行操作。
2. 常用属性
- **
Name**:获取文件的名称(不包括路径)。 - **
FullName**:获取文件的完整路径。 - **
Extension**:获取文件的扩展名(包括.)。 - **
Directory**:获取一个DirectoryInfo对象,表示文件所在的目录。 - **
Length**:获取文件的大小(以字节为单位)。 - **
CreationTime**:获取文件的创建时间。 - **
LastAccessTime**:获取文件的上次访问时间。 - **
LastWriteTime**:获取文件的最后修改时间。
3. 常用方法
- **
Create()**:创建一个新的文件。 - **
Delete()**:删除文件。 - **
CopyTo(string destFileName)**:将文件复制到指定路径。 - **
MoveTo(string destFileName)**:将文件移动到指定路径。 - **
Open()**:打开文件并返回一个FileStream对象,用于读写操作。 - **
OpenRead()**:以读取模式打开文件并返回一个FileStream对象。 - **
OpenWrite()**:以写入模式打开文件并返回一个FileStream对象。
获取文件信息
1 | string filePath = @"C:\example\myfile.txt"; |
创建、复制和删除文件
1 | string sourcePath = @"C:\example\sourcefile.txt"; |
DirectoryInfo类(对文件夹操作)
1. 常用属性
- **
Name**:获取目录的名称(不包括路径)。 - **
FullName**:获取目录的完整路径。 - **
Parent**:获取一个DirectoryInfo对象,表示当前目录的父目录。 - **
Root**:获取一个DirectoryInfo对象,表示目录的根目录(如驱动器根目录)。 - **
Exists**:获取一个值,指示目录是否存在。
2. 常用方法
**
Create()**:创建目录。如果目录已存在,则不执行操作。**
Delete()**:删除目录。可以选择是否递归删除目录及其内容。**
GetFiles()**:获取当前目录中的文件。可以选择筛选文件的搜索模式。**
GetDirectories()**:获取当前目录中的子目录。可以选择筛选目录的搜索模式。**
GetFileSystemInfos()**:获取当前目录中的文件和子目录。**
MoveTo(string destDirName)**:将目录移动到指定路径。
创建、检查和删除目录
1 | string directoryPath = @"C:\example\myDirectory"; |
列出文件和子目录
1 | string directoryPath = @"C:\example"; |
StreamReader和StreamWriter(文本文件)
1. StreamReader 类
StreamReader 用于从流中读取字符(通常是文本文件)。它封装了 Stream 类(如 FileStream)的读取操作,支持读取文本文件中的字符数据。
特性
- 字符流读取:处理字符数据,支持文本编码转换。
- 行读取:可以逐行读取文本内容。
- 缓冲:内部使用缓冲机制提高读取性能。
常用构造函数
- **
StreamReader(Stream stream)**:初始化StreamReader类的新实例,使用指定的流。 - **
StreamReader(string path)**:初始化StreamReader类的新实例,使用指定路径的文件流。 - **
StreamReader(Stream stream, Encoding encoding)**:初始化StreamReader类的新实例,使用指定的流和编码。
常用方法
- **
Read()**:读取下一个字符的整数表示形式。 - **
Read(char[] buffer, int index, int count)**:从流中读取字符到缓冲区。 - **
ReadLine()**:读取当前行的字符,直到换行符或流的末尾。 - **
ReadToEnd()**:读取流中的所有字符,并将其作为字符串返回。 - **
Close()**:关闭StreamReader实例并释放与流相关的资源。
2. StreamWriter 类
StreamWriter 用于向流中写入字符数据(通常是文本文件)。它封装了 Stream 类(如 FileStream)的写入操作,支持将字符数据写入文件。
特性
- 字符流写入:处理字符数据,支持文本编码转换。
- 行写入:可以逐行写入文本内容。
- 缓冲:内部使用缓冲机制提高写入性能。
常用构造函数
- **
StreamWriter(Stream stream)**:初始化StreamWriter类的新实例,使用指定的流。 - **
StreamWriter(string path)**:初始化StreamWriter类的新实例,使用指定路径的文件流。 - **
StreamWriter(Stream stream, Encoding encoding)**:初始化StreamWriter类的新实例,使用指定的流和编码。
常用方法
- **
Write(string value)**:写入字符串数据到流。 - **
WriteLine(string value)**:写入字符串数据和一个行终止符到流。 - **
Flush()**:清空缓冲区,将所有缓冲的字符写入基础流。 - **
Close()**:关闭StreamWriter实例并释放与流相关的资源。
使用 StreamReader 读取文件内容
1 | string filePath = @"C:\example\myfile.txt"; |
使用 StreamWriter 写入文件内容
1 | string filePath = @"C:\example\myfile.txt"; |
使用 StreamReader 和 StreamWriter 处理大文件
1 | string inputPath = @"C:\example\inputfile.txt"; |
性能和注意事项
- 缓冲:
StreamReader和StreamWriter都使用内部缓冲区来提高性能,通常不需要手动调整缓冲区大小。 - 异常处理:在文件操作中,确保处理可能出现的异常,如
FileNotFoundException、UnauthorizedAccessException和IOException。 - 资源管理:使用
using语句可以确保StreamReader和StreamWriter被正确地关闭和释放资源。
总结
- **
StreamReader**:用于从流中读取字符数据,支持逐行读取和整个文件读取。 - **
StreamWriter**:用于向流中写入字符数据,支持逐行写入和完整内容写入。 - 性能:这两个类都具有良好的性能,适用于大多数文本文件处理任务。
与FileStream的关系与使用
FileStream是基础类,用于对文件进行底层字节流操作。它可以作为StreamReader和StreamWriter的基础流,支持更复杂的读取和写入场景。用于对文件进行低级别字节流读写操作。适用于需要直接操作字节流的场景。StreamReader和StreamWriter是基于字符的高级封装类,提供了便捷的读取和写入功能。它们依赖于FileStream或其他Stream类来实现底层操作。分别用于从流中读取字符数据和向流中写入字符数据。它们可以使用FileStream作为基础流来处理文件。对文本文件的读写一般采用**StreamReader** 和StreamWriter,因为不同的文本有不同的编码格式,这两个会帮我们自动处理.
在 .NET 中,处理磁盘驱动器(盘符)的类主要包括 System.IO.DriveInfo。该类提供了对计算机上所有驱动器的详细信息访问,包括磁盘驱动器的类型、可用空间、总空间等。
System.IO.DriveInfo盘符类
功能:提供对计算机上驱动器的详细信息和操作方法。
常用属性和方法:
- 属性:
DriveInfo.AvailableFreeSpace:获取驱动器上的可用空间(以字节为单位)。DriveInfo.TotalFreeSpace:获取驱动器上的总可用空间(以字节为单位)。DriveInfo.TotalSize:获取驱动器的总大小(以字节为单位)。DriveInfo.DriveType:获取驱动器的类型(如本地硬盘、可移动磁盘、网络驱动器等)。DriveInfo.VolumeLabel:获取或设置驱动器的卷标。DriveInfo.RootDirectory:获取驱动器的根目录。
- 方法:
DriveInfo.GetDrives():获取计算机上所有的驱动器信息。
MemoryStream 内存流
MemoryStream 是 C# 中的一个类,属于 System.IO 命名空间,它允许你在内存中读写数据。这是一种非常方便的方式来处理数据流,而不需要涉及文件系统或其他外部存储。以下是 MemoryStream 的一些常见用法和特性:
主要特性
- 内存中操作:
MemoryStream将数据存储在内存中,这意味着读写操作非常快,适用于短期存储和临时数据操作。
- 动态大小:
MemoryStream可以自动调整大小以适应写入的数据量。
- 可以从现有数据构造:
- 可以通过提供初始字节数组来初始化
MemoryStream,从而在内存中处理已有的数据。
- 可以通过提供初始字节数组来初始化
主要方法和属性
- 构造函数:
MemoryStream():创建一个新的空内存流。MemoryStream(byte[] buffer):使用现有的字节数组初始化MemoryStream。MemoryStream(byte[] buffer, bool writable):使用现有的字节数组,并指定是否允许写入。
- 属性:
CanRead:获取一个值,指示当前流是否支持读取操作。CanWrite:获取一个值,指示当前流是否支持写入操作.Length:获取流中当前的数据长度。Position:获取或设置流的位置(指示下一个读取或写入操作的偏移量)。
- 方法:
Read(byte[] buffer, int offset, int count):从流中读取数据到字节数组。Write(byte[] buffer, int offset, int count):将数据从字节数组写入到流中。Seek(long offset, SeekOrigin origin):设置流的位置。Flush():清空流中的缓冲区。ToArray():返回内存流中当前数据的字节数组。
ms.Seek 方法
ms: 这是一个MemoryStream实例,它表示一个内存中的流,用于读写数据。Seek方法: 这是Stream类中的一个方法,用于设置流中的当前位置。其签名如下:1
2
3csharp
复制代码
public long Seek(long offset, SeekOrigin origin);offset: 从origin位置开始的字节数。可以是正数或负数。origin:SeekOrigin枚举,指定位置计算的起点。
SeekOrigin 枚举
SeekOrigin.Begin: 表示流的开头。使用SeekOrigin.Begin作为origin参数时,offset指定从流的开始位置的偏移量。SeekOrigin.Current: 表示当前位置。使用此选项时,offset是相对于当前位置的偏移量。SeekOrigin.End: 表示流的末尾。使用此选项时,offset是相对于流的末尾的偏移量(通常是负值)。
4. StringReader
StringReader 用于从内存中的字符串读取数据:
1 | csharp复制代码using System; |


