返回生成的文件,然后将其从服务器上删除

时间:2014-12-02 16:15:17

标签: servicestack

我有一个ServiceStack服务,该服务生成一个.zip文件,然后通过以下方式返回:

result = new HttpResult(new FileInfo(zipFileName), asAttachment: false);

接着(稍后)

Directory.Delete(dir); // Containing the zipfile

return result

我遇到的问题是我现在要删除生成的文件,但我不能,因为它仍然很忙。 违反访问权限无效。

处理此问题的最佳方法是什么?有没有办法将整个内容写入响应流,这将释放目录?

1 个答案:

答案 0 :(得分:4)

有许多不同的方法可以返回二进制响应,可以在ImageService中看到:例如你可以:

  • 从您的服务中返回byte[]StreamIStreamWriter,直接写入回复
  • byte[]中包含StreamHttpResult个响应,以自定义HTTP响应标头
  • 直接写入您服务中的base.Response
  • 返回自定义自定义结果

这是一个实现IStreamWriter的自定义Result示例,它将文件写入响应流并删除Dispose()方法中包含文件的父目录:

public class ZipFileResult : IDisposable, IStreamWriter, IHasOptions
{
    private readonly FileInfo fileInfo;

    public ZipFileResult(FileInfo zipInfo, string contentType="application/zip") 
    {
        fileInfo = zipInfo;
        Options = new Dictionary<string, string> {
            { HttpHeaders.ContentType, contentType }
        };
    }

    public void WriteTo(Stream responseStream)
    {
        using (var fs = fileInfo.OpenRead())
        {
            fs.WriteTo(responseStream);
            return;
        }
    }

    public void Dispose()
    {
       Directory.Delete(fileInfo.DirectoryName);
    }

    public IDictionary<string, string> Options { get; set; }
}
相关问题