using System;
using System.IO;
namespace NetWorkHelper
{
///
/// 文件管理类
///
public class SendFileManager : IDisposable
{
#region 变量
private FileStream _fileStream;
#endregion
#region 构造函数
public SendFileManager(string fileName)
{
FileName = fileName;
Create(fileName);
}
public SendFileManager(string fileName, int partSize)
{
FileName = fileName;
PartSize = partSize;
Create(fileName);
}
#endregion
#region 属性
public long PartCount { get; set; }
public long Length { get; private set; }
public int PartSize { get; } = 1024 * 20;
public string FileName { get; }
public string Name
{
get { return new FileInfo(FileName).Name; }
}
public string MD5 { get; private set; }
public object Tag { get; set; }
internal Stream FileStream { get; private set; }
#endregion
#region 方法
///
/// 创建初始化文件管理类
///
/// 文件路径
private void Create(string fileName)
{
_fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, PartSize * 10, true);
FileStream = Stream.Synchronized(_fileStream);
Length = _fileStream.Length;
PartCount = Length / PartSize;
if (Length % PartSize != 0)
{
PartCount++;
}
MD5 = MD5Helper.CretaeMD5(_fileStream);
}
///
/// 读取文件
///
///
public void Read(int index)
{
int size = PartSize;
if (Length - PartSize * index < PartSize)
{
size = (int)(Length - PartSize * index);
}
byte[] buffer = new byte[size];
ReadFileObject obj = new ReadFileObject(index, buffer);
FileStream.Position = index * PartSize;
FileStream.BeginRead(buffer, 0, size, new AsyncCallback(EndRead), obj);
}
///
/// 结束读取文件
///
///
private void EndRead(IAsyncResult result)
{
if (FileStream == null)
{
return;
}
int length = FileStream.EndRead(result);
ReadFileObject state = (ReadFileObject)result.AsyncState;
int index = state.Index;
byte[] buffer = state.Buffer;
ReadFileBufferEventArgs e = null;
if (length < PartSize)
{
byte[] realBuffer = new byte[length];
Buffer.BlockCopy(buffer, 0, realBuffer, 0, length);
e = new ReadFileBufferEventArgs(index, realBuffer);
}
else
{
e = new ReadFileBufferEventArgs(index, buffer);
}
OnReadFileBuffer(e);
}
#endregion
#region 事件
///
/// 读取文件事件
///
public event ReadFileBufferEventHandler ReadFileBuffer;
///
/// 读取文件方法
///
///
protected void OnReadFileBuffer(ReadFileBufferEventArgs e)
{
ReadFileBuffer?.Invoke(this, e);
}
#endregion
#region IDisposable 成员
public void Dispose()
{
if (_fileStream != null)
{
FileStream.Flush();
FileStream.Close();
FileStream.Dispose();
FileStream = null;
_fileStream = null;
}
}
#endregion
}
}