Files
TouchSocket/handbook/docs/filepool.mdx

77 lines
2.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: filepool
title: 文件流池
---
### 定义
命名空间TouchSocket.Core <br/>
程序集:[TouchSocket.Core.dll](https://www.nuget.org/packages/TouchSocket.Core)
## 一、说明
文件在读或写的时候一直都是独占状态。这个问题在不同进程中似乎是合理的但是如果在相同进程里就会显得很呆。例如我们在下载文件的时候希望能同一时间多个读取同一个文件。且能有一个闭环的管理。那么使用FilePool就显得非常必要了。
## 二、使用读
从FilePool.GetReader的静态函数中获取一个**线程安全**的文件读取访问器该访问器具有读和相关的操作属性。在每次读取后Position会递增。
使用完成后,可以随时释放。
```csharp showLineNumbers
int Length = 0;
byte[] buffer = new byte[1024 * 1024];
using (var reader = FilePool.GetReader(path))
{
while (true)
{
int r = reader.Read(buffer, 0, buffer.Length);
if (r == 0)
{
break;
}
Length += r;
}
}
Console.WriteLine(Length);
```
## 三、使用写
从FilePool.GetWriter的静态函数中获取一个文件写入访问器线程安全该访问器具有写和相关的操作属性。在每次写入后Position会递增。
使用完成后,可以随时释放。
注意默认调用**Dispose**后,文件会根据创建类型是否为**单一访问**而决定是否立即释放。
```csharp showLineNumbers
byte[] buffer = new byte[1024];
using (var writer = FilePool.GetWriter(path,true))
{
writer.Position = num * package;
int surLen = package;
while (surLen > 0)
{
int r = Math.Min(surLen, buffer.Length);
writer.Write(buffer, 0, r);
surLen -= r;
}
}
Console.WriteLine("完成");
```
## 四、手动释放文件资源
当某个文件没有及时释放或者由于不可知异常而没有释放时可以调用FilePool.TryReleaseFile减少引用并尝试释放资源。
减少引用的意思是当某个文件被创建多个访问器时会递增其引用数当引用数不为0时是不会释放的。所以当调用FilePool.TryReleaseFile时首先会减少引用然后才会判断是否可以释放。
当需要强制释放某个文件时,可以采取下列措施。
```csharp showLineNumbers
while (FilePool.TryReleaseFile(fileName, 0).ResultCode!= ResultCode.Success)
{
}
```