![](/img/trans.png)
[英]FileSystemWatcher C# - cannot access file because it is being used by another process
[英]C# .NET BackgroundWorker 6 FileSystemWatcher The process cannot access the file "PATH" because it is being used by another process
我正在嘗試查看以.csv
結尾的新添加文件的目錄對它們執行某些操作,刪除文件並等待新添加的文件再次處理該文件。 我正在使用具有以下代碼的BackgroundService
:
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly IProcessFileService _processFileService;
private ApplicationOptions _applicationOptions;
private FileSystemWatcher _watcher = new();
public Worker(ILogger<Worker> logger, IProcessFileService processFileService, IOptions<ApplicationOptions> applicationOptions)
{
_logger = logger;
_processFileService = processFileService;
_applicationOptions = applicationOptions.Value;
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
string filePath = _applicationOptions.InputDirectory;
_watcher.Path = filePath;
_watcher.EnableRaisingEvents = true;
_watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.CreationTime | NotifyFilters.LastWrite;
_watcher.Filter = "*.csv*";
_watcher.Created += new FileSystemEventHandler(OnFileCreated);
return Task.CompletedTask;
}
private async void OnFileCreated(object sender, FileSystemEventArgs e)
{
if (e.ChangeType == WatcherChangeTypes.Created)
{
await HandleAddedFile();
}
}
private async Task HandleAddedFile()
{
try
{
await _processFileService.ProcessFile();
}
catch(Exception ex)
{
_logger.LogError("{error}", ex.Message);
}
_processFileService.DeleteFileAndLog();
}
}
第一次工作正常,但是當嘗試在目錄中插入第二個文件時,出現錯誤:進程無法訪問文件“PATH”,因為它正被另一個進程使用。
處理 label 包括一些異步工作,我該如何解決這個問題?
我已經關注了羅伯特給我的鏈接; 我不得不重寫一些東西,但現在我已經使用以下代碼讓它工作了。 我還必須修改一些函數以獲取完整路徑。
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly IProcessFileService _processFileService;
private ApplicationOptions _applicationOptions;
private FileSystemWatcher _watcher = new();
public Worker(ILogger<Worker> logger, IProcessFileService processFileService, IOptions<ApplicationOptions> applicationOptions)
{
_logger = logger;
_processFileService = processFileService;
_applicationOptions = applicationOptions.Value;
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
string filePath = _applicationOptions.InputDirectory;
_watcher.Path = filePath;
_watcher.EnableRaisingEvents = true;
_watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.CreationTime | NotifyFilters.LastWrite;
_watcher.Filter = "*.csv*";
_watcher.Created += new FileSystemEventHandler(OnFileCreated);
return Task.CompletedTask;
}
private async void OnFileCreated(object sender, FileSystemEventArgs e)
{
if (e.ChangeType == WatcherChangeTypes.Created)
{
await HandleAddedFile(e);
}
}
static FileStream? WaitForFile(string fullPath, FileMode mode, FileAccess access, FileShare share)
{
for (int numTries = 0; numTries < 10; numTries++)
{
FileStream? fs = null;
try
{
fs = new FileStream(fullPath, mode, access, share);
return fs;
}
catch (IOException)
{
fs?.Dispose();
Thread.Sleep(50);
}
}
return null;
}
private async Task HandleAddedFile(FileSystemEventArgs e)
{
FileStream? fileStream = null;
try
{
fileStream = WaitForFile(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read);
await _processFileService.ProcessFile(e.FullPath);
}
catch(Exception ex)
{
_logger.LogError("{error}", ex.Message);
}
fileStream?.Dispose();
_processFileService.DeleteFileAndLog(e.FullPath);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.