如何解锁文件流锁



我正在实现一个模块,用于将文件从客户端计算机上传到服务器。在服务器端,我正在使用 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();
}
}

分块模块在函数请求时发送分块。FileByteStream.Read(buffer, 0, buffer.长度)正在消耗。

初始化文件流后,文件被锁定

(这是初始化文件流进行写入时的正常行为),但我遇到的问题是我在执行发送/接收过程时停止上传过程,然后分块模块使用的通道没有被取消,所以文件保持锁定,因为 WCF 服务仍在等待发送更多数据, 直到发送超时到期(超时为 1 小时,因为我需要上传文件 +2.5GB)。下次上载时,如果我尝试上载同一文件,则会在 WCF 服务上收到异常,因为无法为同一文件再次初始化文件流。

想知道是否有办法避免/删除文件锁定,因此在下次运行时,即使以前的文件流已经锁定了该文件,我也可以重新上传相同的文件。

任何帮助将不胜感激,谢谢。

我个人不喜欢这种解决方案。保持连接并不理想。

使用您的示例,您可能正在处理 2.5GB 文件的一半,并且该过程可能会中止。你最终会陷入上述情况。更糟糕的是,您需要重新提交所有已提交的数据。

我会自己处理块并将它们附加到同一个文件服务器端。调用指示文件正在启动的 WCF 方法,以块的形式上载数据,然后在上载完成后调用另一个方法。如果您确信文件名是唯一的,那么您甚至可以通过单个方法调用来完成此操作。

像这样:

ulong StartFile(string filename) // This returns the data already uploaded
void UploadFile(string filename, ulong start, byte[] data)
void EndFile(string filename) // Just as a safety net

如果您不想走我上面概述的路线(它不直接回答您的问题),那么解决上述问题的一个简单方法是在上传时使用临时文件名,然后在上传完成后重命名文件。无论如何,您确实应该采用这种方法,以防止服务器上的应用程序在上传完成之前获取文件。

最新更新