我們有一個流程,人們用復印機掃描檔案并將它們放在我們檔案服務器上的某個目錄中。然后我們在 .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(String sourceFullPath, String destFullPath, Boolean overwrite) at System.IO.File.Move(String sourceFileName, String destFileName, Boolean overwrite)
到現在為止還挺好。我希望在無法移動檔案后,它會保留在應該移動的目錄中。但事實并非如此。昨天下午我們遇到了這個問題,在我查找檔案后,它從目錄中消失了。
這是 File.Move() 方法的正常行為嗎?
uj5u.com熱心網友回復:
通常,File.Move()僅在目標檔案成功傳輸到位后才洗掉源檔案。所以你的問題的答案是否定的,它不能純粹是File.Move(). 有趣的是,為什么這個檔案被鎖定了?可能是因為某些檔案流仍處于打開狀態并阻止訪問該檔案。另外,您是否有多個正在運行的復制流程服務實體?這可能會導致多個服務嘗試同時訪問該檔案,從而導致您發布的例外。
一定有不同的原因使檔案消失,因為File.Move()當復制程序沒有成功時,肯定不會洗掉檔案。
出于除錯目的,您可以嘗試打開帶有鎖的檔案。當不同的行程鎖定檔案為您提供更多資訊時,這將失敗。
uj5u.com熱心網友回復:
先回答你的問題:
這是 File.Move() 方法的正常行為嗎?
不,那不是預期的行為。該檔案說:
跨磁盤卷移動檔案等效于復制檔案,如果復制成功,則將其從源中洗掉。
如果您嘗試跨磁盤卷移動檔案并且該檔案正在使用中,則該檔案會被復制到目的地,但不會從源中洗掉。
您Exception說,另一個行程正在同時使用該檔案。因此,您應該檢查應用程式的其他部分是否可能執行洗掉,或者是否有人(如果此方案有效)正在從檔案系統中手動洗掉檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/365820.html
