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; |