我正在实现一个模块,从客户端机器向服务器上传文件。在服务器端,我使用WCF Soap服务。
为了分块上传文件,我实施了Microsoft的这个示例http://msdn.microsoft.com/en-us/library/aa717050.aspx。我已经能够在简单的情况下使它工作,因此它确实可以分块上传文件。这个分块模块使用了WSDualHttpBinding。
我需要实现一个功能,在上传具体文件时,如果上传过程由于任何原因(用户选择、机器关闭等)停止,能够重新上传文件。
在我的WCF服务中,我有一个方法处理服务器端的文件写入:
public void UploadFile(RemoteFileInfo request)
{
FileInfo fi = new FileInfo(Path.Combine(Utils.StorePath(), request.FileName));
if (!fi.Directory.Exists)
{
fi.Directory.Create();
}
FileStream file = new FileStream(fi.FullName, FileMode.Create, FileAccess.Write);
int count;
byte[] buffer = new byte[4096];
while ((count = request.FileByteStream.Read(buffer, 0, buffer.Length)) > 0)
{
file.Write(buffer, 0, count);
file.Flush();
}
request.FileByteStream.Close();
file.Position = 0;
file.Close();
if (request.FileByteStream != null)
{
request.FileByteStream.Close();
request.FileByteStream.Dispose();
}
}
在函数request.FileByteStream.Read(buffer, 0, buffer.Length)被使用时,分块模块正在发送数据块。
文件流初始化后,文件会被锁定(这是为写入初始化文件流的正常行为),但我遇到的问题是,当发送/接收过程正在执行时停止上传流程,那么分块模块使用的通道不会被取消,因此文件保持被锁定状态,因为WCF服务仍在等待传输更多数据,直到发送超时(超时时间为1小时,因为我需要上传文件+2.5GB)。下次上传时,如果我尝试上传相同的文件,则会在WCF服务处收到异常,因为无法再次为同一文件初始化文件流。
请问是否有方法可以避免/删除文件锁定,以便在下次运行时,即使先前的文件流已经锁定了该文件,也能重新上传同一文件。
非常感谢任何帮助。
FileStream.Unlock
吗? - Xenon