文件在移动失败后会消失



我们有一个流程,人们用复印机扫描文档,并将它们放在我们文件服务器上的某个目录中。然后我们在一小时内提供服务。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-块中,文件移动发生在该块中。有时我们会遇到程序抛出以下异常的问题

2021-11-23 17:15:37960[60]错误应用程序-----无法移动文件:\PATH\PATH\PATH\Filename_423489120.pdf-----委托编号:05847894系统IO.IOException:进程无法访问该文件,因为另一个进程正在使用该文件。在系统中。IO.FileSystem.MoveFile(字符串sourceFullPath、字符串destFullPath、布尔覆盖(在系统中。IO.File.Move(字符串源文件名、字符串目标文件名、布尔覆盖(

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

这是文件的正常行为吗。Move((方法?

首先回答您的问题:

这是文件的正常行为吗。Move((方法?

不,这不是预期的行为。文件上写着:

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

如果您尝试在磁盘卷之间移动文件,而该文件正在使用中,文件被复制到目标,但不会从来源

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

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

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

出于调试目的,您可以尝试在锁定文件的情况下打开该文件。当其他进程锁定文件并为您提供更多信息时,这将失败。

最新更新