RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1547021
Accepted
air
air
Asked:2023-10-20 23:41:01 +0000 UTC2023-10-20 23:41:01 +0000 UTC 2023-10-20 23:41:01 +0000 UTC

关闭文件连接

  • 772

我无法弄清楚我在哪里错误地释放了资源/关闭了文件。我在任何地方都使用 using,但仍然出现该文件已被另一个进程使用的异常

public class DownloadControllerBase : ControllerBase
{
    private readonly IUpdateFile _updateFile;
    public DownloadControllerBase(IUpdateFile updateFile)
    {
        _updateFile = updateFile;
    }

    public async Task<IActionResult> DownloadFilesBase(
        int userID,
        string folderForDownloadCryptedFiles,
        string zipFileName)
    {
        try
        {
            string encryptedFilesFolder = Path.Combine(folderForDownloadCryptedFiles, $"User({userID})");
            string[] files = Directory.GetFiles(encryptedFilesFolder);

            if (files.Length == 0)
                return StatusCode(404, new { message = BaseErrorMessage.DownloadNoFiles });

            string zipFilePath = Path.Combine(encryptedFilesFolder, zipFileName);
            await CreateZipFile(userID, zipFilePath, files);

            return await DeleteZipAndCreateResponse(zipFilePath, zipFileName);
        }
        catch (DirectoryNotFoundException)
        {
            return StatusCode(404, new { message = BaseErrorMessage.FolderNotFound });
        }
    }

    private async Task CreateZipFile(int userID, string zipFilePath, string[] files)
    {
        using var zipStream = new FileStream(zipFilePath, FileMode.Create);
        using var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, true);
        foreach (var file in files)
        {
            var fileInfo = new FileInfo(file);
            var entry = archive.CreateEntry(fileInfo.Name, CompressionLevel.Fastest);

            using (var entryStream = entry.Open())
            using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
            {
                await fileStream.CopyToAsync(entryStream);
            }
            var fileName = Path.GetFileName(file);
            await UpdateFile(userID, fileName);

            await Task.Run(() => System.IO.File.Delete(file));
        }
    }

    private async Task UpdateFile(int userID, string fileName)
    {
        var DbData = new UserFileModel()
        {
            user_id = userID,
            file_name = fileName,
            status = Status.downloaded.ToString(),
            download_time = DateTime.UtcNow
        };

        await _updateFile.UpdateFileByNameOrID(DbData, "fileName");
    }

    private async Task<IActionResult> DeleteZipAndCreateResponse(string zipFilePath, string zipFileName)
    {
        using var stream = new FileStream(zipFilePath, FileMode.Open, FileAccess.Read);

        await Task.Run(() => System.IO.File.Delete(zipFilePath));

        return File(stream, "application/zip", zipFileName);
    }
}

这是在控制器中调用该方法的方式:

    [HttpGet("Download")]
    public async Task<IActionResult> DownloadFiles([FromRoute] string type)
    {
        try
        {
            var param = _cryptographyParams.GetCryptographyParamsNoKey(type, FuncType.encrypt.ToString());

            return await _downloadController.DownloadFilesBase(_userInfo.UserId, param.downloadFolder, "EncryptedFiles.zip");
        }
        catch (InvalidRouteException ex)
        {
            return StatusCode(404, new { message = ex.Message });
        }
    }

异常日志:

fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
      An unhandled exception has occurred while executing the request.
      System.IO.IOException: The process cannot access the file 'C:\FileCryptWeb Users\Private\Encrypted files for download\User(22)\EncryptedFiles.zip' because it is being used by another process.
         at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)
         at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
         at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
         at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
         at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
         at FileCryptWeb.Controllers.BaseControllers.DownloadControllerBase.CreateZipFile(Int32 userID, String zipFilePath, String[] files) in C:\Users\Stewi\Source\Repos\air2921\FileCryptWeb\FileCryptWeb\Controllers\BaseControllers\DownloadControllerBase.cs:line 51
         at FileCryptWeb.Controllers.BaseControllers.DownloadControllerBase.DownloadFilesBase(Int32 userID, String folderForDownloadCryptedFiles, String zipFileName) in C:\Users\Stewi\Source\Repos\air2921\FileCryptWeb\FileCryptWeb\Controllers\BaseControllers\DownloadControllerBase.cs:line 31
         at FileCryptWeb.Controllers.CryptionControllers.EncryptionController.DownloadFiles(String type) in C:\Users\Stewi\Source\Repos\air2921\FileCryptWeb\FileCryptWeb\Controllers\EnryptionControllers\EncryptionController.cs:line 94
         at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
         at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
         at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
         at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
         at FileCryptWeb.JwtTokenMiddleware.Invoke(HttpContext context, FileCryptDbContext dbContext, ITokenService tokenService) in C:\Users\Stewi\Source\Repos\air2921\FileCryptWeb\FileCryptWeb\JwtTokenMiddleware.cs:line 47
         at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
         at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
         at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
c#
  • 1 1 个回答
  • 67 Views

1 个回答

  • Voted
  1. Best Answer
    CrazyElf
    2023-10-21T00:06:13Z2023-10-21T00:06:13Z

    正如我在评论中已经写的那样,问题是您正在尝试删除打开用于流式传输的文件。

    我在英语SO上找到了答案。您可以设置该标志FileOptions.DeleteOnClose,以便正在流式传输的文件在使用后自动删除。

    private async Task<IActionResult> DeleteZipAndCreateResponse(string zipFilePath, string zipFileName)
    {
        var stream = new FileStream(zipFilePath, FileMode.Open,
            FileAccess.Read, FileShare.None, 4096, FileOptions.DeleteOnClose);
    
        return File(stream, "application/zip", zipFileName);
    }
    

    其余参数只需简单编写,以便使用此参数调用所需的方法,并且必须在那里指定其余参数。

    • 3

相关问题

  • 使用嵌套类导出 xml 文件

  • 分层数据模板 [WPF]

  • 如何在 WPF 中为 ListView 手动创建列?

  • 在 2D 空间中,Collider 2D 挂在玩家身上,它对敌人的重量相同,我需要它这样当它们碰撞时,它们不会飞向不同的方向。统一

  • 如何在 c# 中使用 python 神经网络来创建语音合成?

  • 如何知道类中的方法是否属于接口?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5