FileStream и FileSystemWatcher в C #, странная проблема «процесс не может получить доступ к файлу»

У меня есть эта сложная кодовая база, которая прослушивает события FileCreated в определенной папке. Когда файл создан (который также включает перемещение файла в эту папку), я хочу прочитать этот файл и что-то с ним сделать. Это работает для первого файла, но выдает исключение после всех остальных попыток. В режиме отладки (с VisualStudio) будет сгенерирована ошибка, но если я просто нажму «продолжить» ... то будет работать (без ошибки).

Я разместил упрощенный код, который демонстрирует проблему.

Например, вы запускаете приложение, нажимаете кнопку «Пуск», а затем «создаете новый текстовый файл»

Выход:

Working

Если вы затем создаете 2ed-файл точно таким же образом, результат будет следующим:

Broken: The process cannot access the file 'C:\TestFolder\New Text Document (2).txt' because it is being used by another process.
Working, after breaking

Посмотрев на мой код, вы увидите, что вышеприведенный набор распечаток подразумевает, что сначала было сгенерировано исключение «невозможно получить доступ к файлу», но выполнение того же вызова в операторе catch неожиданно работает.

Это не имеет никакого смысла для меня, так как файл явно не используется ничем другим (я только что создал его) .. и он все равно работает секунду спустя ....

Ниже мой код

XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" >
    <StackPanel>
        <Button Click="Button_Click"  Content="Start"/>
    </StackPanel>
</Window>

Код позади:

using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;


namespace WpfApplication1
{ 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            test();
        }


        String Folder = @"C:\TestFolder";

        private void test()
        {
            FileSystemWatcher watch = new FileSystemWatcher(Folder);
            watch.Created += new FileSystemEventHandler(FileCreated);
            watch.EnableRaisingEvents = true;

            Process.Start(Folder);
        }

        private void FileCreated(object sender, FileSystemEventArgs fsEvent)
        {

            if (File.Exists(fsEvent.FullPath))
            {

                // Thread.Sleep(1000);// Sleeping for 1 second seems to prevent the error from happening...?
                // If i am debugging, and pause on exceptions... then it also suddenly works (similar to the Sleep above)
                try
                {

                    FileStream fs = new FileStream(fsEvent.FullPath, FileMode.Open); 
                    Console.WriteLine("Working");
                    fs.Close();
                }
                catch (IOException ex)
                {
                    Console.WriteLine("Broken: " + ex.Message);
                    try
                    {                        
                        FileStream fs = new FileStream(fsEvent.FullPath, FileMode.Open);
                        Console.WriteLine("Working, after breaking");
                        fs.Close();

                    }
                    catch(IOException ex2)
                    {                        
                        FileStream fs = new FileStream(fsEvent.FullPath, FileMode.Open);
                        Console.WriteLine("really broken: " + ex2.Message);
                        fs.Close();
                    }
                }


            }
        }
    }
}

Ответы на вопрос(3)

Ваш ответ на вопрос