No title

文件操作(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
    4
    using (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
2
3
4
5
6
7
8
9
string str = "今天是个好天气";
byte[] buffer = Encoding.Default.GetBytes(str);
//没有这个文件会给你创建一个,有的话会覆盖掉
File.WriteAllBytes(@"C:\Users\31595\Desktop\old.txt",buffer);

File.WriteAllLine(@"C:\Users\31595\Desktop\old.txt",new string[] {"abc","dda"});

File.WriteAllText(@"C:\Users\31595\Desktop\old.txt","张三李四王五");

读取文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//按行读取,返回的是字符串数组
string[] contents = File.ReadAllLines(@"C:\Users\31595\Desktop\old.txt",Encoding.Default);//指定一个编码格式
foreach (string line in contents)
{
Console.WriteLine(line);
}

//整个读取,返回的是字符串
string strs = File.ReadAllText(@"C:\Users\31595\Desktop\old.txt", Encoding.Default);//指定一个编码格式
Console.WriteLine(strs);

//将字节数组中每一个元素都按照指定的编码格式解码成字符串
byte[] buffer = File.ReadAllBytes(@"C:\Users\31595\Desktop\new.txt");
string s = Encoding.GetEncoding("UTF-8").GetString(buffer);
Console.WriteLine(s);

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 处理的是原始字节流,可以读取或写入任意类型的数据。
  • 同步和异步:支持同步和异步操作,适用于不同的性能需求。
  • 文件操作提供了直接对文件的流式读写操作,比 FileStreamReader/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
2
3
4
5
6
7
8
9
10
11
12
13
string filePath = @"C:\example\myfile.txt";

// 以读取模式打开文件
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
// 读取文件内容
byte[] buffer = new byte[fileStream.Length];//每次多大
int bytesRead = fileStream.Read(buffer, 0, buffer.Length);//读出来的有效数量

// 打印文件内容
Console.WriteLine("File content:");
Console.WriteLine(System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead));
}
写入文件内容
1
2
3
4
5
6
7
8
9
10
11
12
string filePath = @"C:\example\myfile.txt";
string content = "Hello, FileStream!";

// 以写入模式打开文件
using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
// 写入内容到文件
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(content);
fileStream.Write(buffer, 0, buffer.Length);
}

Console.WriteLine("Content written to file.");
异步操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
string filePath = @"C:\example\myfile.txt";

// 异步写入文件
using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true))
//4096: 这是缓冲区大小(以字节为单位)。
//true: 这个布尔值指定了文件是否应异步打开。
{
// 将字符串转换为字节数组
byte[] buffer = System.Text.Encoding.UTF8.GetBytes("Hello, async FileStream!");
await fileStream.WriteAsync(buffer, 0, buffer.Length);
}

Console.WriteLine("Asynchronous content written to file.");

// 异步读取文件
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None, 4096, true))
{
byte[] buffer = new byte[fileStream.Length];
int bytesRead = await fileStream.ReadAsync(buffer, 0, buffer.Length);

Console.WriteLine("Asynchronous file content:");
Console.WriteLine(System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead));
}
1
2
3
4
5
6
7
8
9
10
11
12
//使用FileStream类读取数据
FileStream fsRead = new FileStream(@"C:\Users\31595\Desktop\old.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
byte[] buffer = new byte[1024];//每次读取的最大字节数
//返回每次实际读取到的有效字节数
int r = fsRead.Read(buffer, 0, buffer.Length);
//将字节数组中每一个元素按照指定的编码格式解码成字符串
string s = Encoding.Default.GetString(buffer,0,r);
//关闭流
fsRead.Close();
//释放流占用的资源
fsRead.Dispose();
Console.WriteLine(s);

将创建文件流对象的过程写在using中,会自动帮我们释放流所占用的资源.

1
2
3
4
5
6
using (FileStream fsWrite = new FileStream(@"C:\Users\31595\Desktop\new.txt",FileMode.OpenOrCreate,FileAccess.ReadWrite))
{
string str = "看会不会覆盖";
byte[] butter = Encoding.Default.GetBytes(str);
fsWrite.Write(butter,0,butter.Length);//(字节块,从哪开始,最多写入的字节数)
}

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
string filePath = @"C:\example\myfile.txt";
FileInfo fileInfo = new FileInfo(filePath);

if (fileInfo.Exists)
{
Console.WriteLine($"File Name: {fileInfo.Name}");
Console.WriteLine($"Full Path: {fileInfo.FullName}");
Console.WriteLine($"Extension: {fileInfo.Extension}");
Console.WriteLine($"Size: {fileInfo.Length} bytes");
Console.WriteLine($"Created On: {fileInfo.CreationTime}");
Console.WriteLine($"Last Accessed On: {fileInfo.LastAccessTime}");
Console.WriteLine($"Last Modified On: {fileInfo.LastWriteTime}");
}
else
{
Console.WriteLine("File does not exist.");
}
创建、复制和删除文件
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
string sourcePath = @"C:\example\sourcefile.txt";
string destPath = @"C:\example\copiedfile.txt";
string newPath = @"C:\example\movedfile.txt";

FileInfo fileInfo = new FileInfo(sourcePath);

// 创建一个新的文件
if (!fileInfo.Exists)
{
using (FileStream fs = fileInfo.Create())
{
byte[] content = System.Text.Encoding.UTF8.GetBytes("Hello, FileInfo!");
fs.Write(content, 0, content.Length);
}
Console.WriteLine("File created.");
}

// 复制文件
fileInfo.CopyTo(destPath, overwrite: true);
Console.WriteLine("File copied.");

// 移动文件
fileInfo.MoveTo(newPath);
Console.WriteLine("File moved.");

// 删除文件
FileInfo movedFileInfo = new FileInfo(newPath);
movedFileInfo.Delete();
Console.WriteLine("File deleted.");

DirectoryInfo类(对文件夹操作)

1. 常用属性

  • **Name**:获取目录的名称(不包括路径)。
  • **FullName**:获取目录的完整路径。
  • **Parent**:获取一个 DirectoryInfo 对象,表示当前目录的父目录。
  • **Root**:获取一个 DirectoryInfo 对象,表示目录的根目录(如驱动器根目录)。
  • **Exists**:获取一个值,指示目录是否存在。

2. 常用方法

  • **Create()**:创建目录。如果目录已存在,则不执行操作。

  • **Delete()**:删除目录。可以选择是否递归删除目录及其内容。

  • **GetFiles()**:获取当前目录中的文件。可以选择筛选文件的搜索模式。

  • **GetDirectories()**:获取当前目录中的子目录。可以选择筛选目录的搜索模式。

  • **GetFileSystemInfos()**:获取当前目录中的文件和子目录。

  • **MoveTo(string destDirName)**:将目录移动到指定路径。

创建、检查和删除目录
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
string directoryPath = @"C:\example\myDirectory";
string newDirectoryPath = @"C:\example\myNewDirectory";

// 创建目录
if (!Directory.Exists(directoryPath))
{
Directory.CreateDirectory(directoryPath);
Console.WriteLine("Directory created.");
}

// 检查目录是否存在
if (Directory.Exists(directoryPath))
{
Console.WriteLine("Directory exists.");
}

// 移动目录
if (Directory.Exists(directoryPath))
{
Directory.Move(directoryPath, newDirectoryPath);
Console.WriteLine("Directory moved.");
}

// 删除目录(递归)
if (Directory.Exists(newDirectoryPath))
{
Directory.Delete(newDirectoryPath, recursive: true);
Console.WriteLine("Directory deleted.");
}
列出文件和子目录
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
string directoryPath = @"C:\example";

// 列出目录中的文件
if (Directory.Exists(directoryPath))
{
string[] files = Directory.GetFiles(directoryPath);
Console.WriteLine("Files in the directory:");
foreach (string file in files)
{
Console.WriteLine(Path.GetFileName(file));
}

// 列出目录中的子目录
string[] directories = Directory.GetDirectories(directoryPath);
Console.WriteLine("Subdirectories in the directory:");
foreach (string dir in directories)
{
Console.WriteLine(Path.GetFileName(dir));
}

// 列出目录中的文件和子目录
string[] fileSystemEntries = Directory.GetFileSystemEntries(directoryPath);
Console.WriteLine("Files and directories in the directory:");
foreach (string entry in fileSystemEntries)
{
Console.WriteLine(Path.GetFileName(entry));
}
}
else
{
Console.WriteLine("Directory does not exist.");
}

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
2
3
4
5
6
7
8
9
string filePath = @"C:\example\myfile.txt";

// 使用 StreamReader 读取文件内容
using (StreamReader reader = new StreamReader(filePath))
{
string content = reader.ReadToEnd(); // 读取整个文件内容
Console.WriteLine("File content:");
Console.WriteLine(content);
}

使用 StreamWriter 写入文件内容

1
2
3
4
5
6
7
8
9
10
string filePath = @"C:\example\myfile.txt";
string content = "Hello, StreamWriter!";

// 使用 StreamWriter 写入文件内容
using (StreamWriter writer = new StreamWriter(filePath))
{
writer.WriteLine(content); // 写入字符串内容和换行符
}

Console.WriteLine("Content written to file.");

使用 StreamReaderStreamWriter 处理大文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string inputPath = @"C:\example\inputfile.txt";
string outputPath = @"C:\example\outputfile.txt";

// 使用 StreamReader 读取文件内容
using (StreamReader reader = new StreamReader(inputPath))
using (StreamWriter writer = new StreamWriter(outputPath))
{
string line;
while ((line = reader.ReadLine()) != null)
{
// 逐行读取并写入新文件
writer.WriteLine(line);
}
}

Console.WriteLine("File copied.");

性能和注意事项

  • 缓冲StreamReaderStreamWriter 都使用内部缓冲区来提高性能,通常不需要手动调整缓冲区大小。
  • 异常处理:在文件操作中,确保处理可能出现的异常,如 FileNotFoundExceptionUnauthorizedAccessExceptionIOException
  • 资源管理:使用 using 语句可以确保 StreamReaderStreamWriter 被正确地关闭和释放资源。

总结

  • **StreamReader**:用于从流中读取字符数据,支持逐行读取和整个文件读取。
  • **StreamWriter**:用于向流中写入字符数据,支持逐行写入和完整内容写入。
  • 性能:这两个类都具有良好的性能,适用于大多数文本文件处理任务。

与FileStream的关系与使用

  • FileStream 是基础类,用于对文件进行底层字节流操作。它可以作为 StreamReaderStreamWriter 的基础流,支持更复杂的读取和写入场景。用于对文件进行低级别字节流读写操作。适用于需要直接操作字节流的场景。
  • StreamReaderStreamWriter 是基于字符的高级封装类,提供了便捷的读取和写入功能。它们依赖于 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 的一些常见用法和特性:

主要特性

  1. 内存中操作
    • MemoryStream 将数据存储在内存中,这意味着读写操作非常快,适用于短期存储和临时数据操作。
  2. 动态大小
    • MemoryStream 可以自动调整大小以适应写入的数据量。
  3. 可以从现有数据构造
    • 可以通过提供初始字节数组来初始化 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
    3
    csharp
    复制代码
    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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
csharp复制代码using System;
using System.IO;

class Program
{
static void Main()
{
string input = "Hello, StringReader!";

using (StringReader reader = new StringReader(input))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
}