【问题标题】:Files disappear after they fail to be moved文件移动失败后消失
【发布时间】:2021-11-24 07:39:22
【问题描述】:

我们有一个流程,人们使用复印机扫描文档并将它们放到我们文件服务器上的某个目录中。然后,我们在 .NET Core 应用程序中有一个每小时一次的服务,它会扫描目录、抓取文件并根据文件名将它们移动到某个目录。问题来了。

代码看起来像这样:

private string MoveFile(string file, string commNumber)
        {
            var fileName = Path.GetFileName(file);
            var baseFileName = Path.GetFileNameWithoutExtension(fileName).Split("-v")[0];
            // 1. Check if the file already exists at destination
            var existingFileList = luxWebSamContext.Documents.Where(x => EF.Functions.Like(x.DocumentName, "%" + Path.GetFileNameWithoutExtension(baseFileName) + "%")).ToList();
            
            // If the file exists, check for the current version of file
            if (existingFileList.Count > 0)
            {
                var nextVersion = existingFileList.Max(x => x.UploadVersion) + 1;                
                var extension = Path.GetExtension(fileName);
                fileName = baseFileName + "-v" + nextVersion.ToString() + extension;
            }   

            var from = @file;
            var to = Path.Combine(@destinationPath, commNumber,fileName);

            try
            {
                log.Info($"------ Moving File! ------ {fileName}");
                Directory.CreateDirectory(Path.Combine(@destinationPath, commNumber));
                File.Move(from, to, true);
                return to;
            }
            catch (Exception ex)
            {
                log.Error($"----- Couldn't MOVE FILE: {file} ----- commission number: {commNumber}", ex);

有趣的部分是在try-block,文件移动发生的地方。有时我们会遇到程序抛出以下异常的问题

2021-11-23 17:15:37,960 [60] 错误应用程序 ----- 无法移动文件: \PATH\PATH\PATH\Filename_423489120.pdf ----- 委托号: 05847894 System.IO.IOException:该进程无法访问该文件,因为它正被另一个进程使用。 在 System.IO.FileSystem.MoveFile(字符串 sourceFullPath,字符串 destFullPath,布尔覆盖) 在 System.IO.File.Move(String sourceFileName, String destFileName, Boolean overwrite)

到目前为止一切顺利。我希望文件无法移动后,它仍保留在应该移动的目录中。但事实并非如此。我们昨天下午遇到了这个问题,在我查找文件后,它从目录中消失了。

这是 File.Move() 方法的正常行为吗?

【问题讨论】:

    标签: c# .net .net-core


    【解决方案1】:

    通常,File.Move() 只会在目标文件成功传输到位后删除源文件。所以你的问题的答案是否定的,它不可能纯粹File.Move()。有趣的是,为什么这个文件被锁定了?可能是因为某些文件流仍处于打开状态并阻止对文件的访问。此外,您是否有多个正在运行的复制流程服务实例?这可能会导致多个服务尝试同时访问该文件,从而导致您发布的异常。

    肯定有不同的原因导致文件消失,因为File.Move() 在复制过程不成功时肯定不会删除文件。

    出于调试目的,您可以尝试打开带有锁的文件。当另一个进程锁定文件为您提供更多信息时,这将失败。

    【讨论】:

    • 目前我怀疑将文件写入文件系统的扫描仪设备已锁定文件。我的应用程序中实际上没有打开的读/写流。
    【解决方案2】:

    首先回答你的问题:

    这是 File.Move() 方法的正常行为吗?

    不,这不是预期的行为。 documentation 说:

    跨磁盘卷移动文件相当于复制文件 如果复制成功,则从源中删除它。

    如果您尝试跨磁盘卷移动文件并且该文件正在使用中, 文件被复制到目的地,但没有从 来源。

    您的Exception 说,另一个进程正在同时使用该文件。因此,您应该检查您的应用程序的其他部分是否可能执行删除,或者是否有人(如果这种情况有效)正在从文件系统中手动删除文件。

    【讨论】:

      猜你喜欢
      • 2015-08-29
      • 1970-01-01
      • 2022-01-18
      • 2016-09-14
      • 2013-12-17
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多