簡體   English   中英

C# .NET BackgroundWorker 6 FileSystemWatcher 該進程無法訪問文件“PATH”,因為它正被另一個進程使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM