C# IOException: Der Prozess kann nicht auf die Datei zugreifen, da wird Sie von einem anderen Prozess verwendet

Ich habe ein kleines problem. Was meine Anwendung ist supose zu tun, ist zu beobachten, einen Ordner für jede neu kopierte Datei mit der Endung '.XSD' öffnen Sie die Datei und ordnen Sie die Zeilen in ein array. Danach werden die Daten aus dem array eingefügt werden soll in eine MySQL-Datenbank, dann verschieben Sie die Datei in einen anderen Ordner wenn es fertig ist.

Das problem ist, dass die Anwendung funktioniert gut mit der ersten Datei, aber sobald die nächste Datei wird in den Ordner kopiert habe bekomme ich diese Ausnahme zum Beispiel: "Der Prozess kann nicht auf die Datei zugreifen 'C:\inetpub\admission\file2.XPD" weil es wird von einem anderen Prozess verwendet'.

Wenn zwei Dateien auf der onther hand kopiert wird, zur gleichen Zeit, es ist überhaupt kein problem.

Den folgenden code wird auf dem Hauptfenster:

public partial class Form1 : Form
{
    static string folder = specified path;        
    static FileProcessor processor;

    public Form1()
    {
        InitializeComponent();
        processor = new FileProcessor();
        InitializeWatcher();
    }

    static FileSystemWatcher watcher;

    static void InitializeWatcher()
    {
        watcher = new FileSystemWatcher();
        watcher.Path = folder;

        watcher.Created += new FileSystemEventHandler(watcher_Created);
        watcher.EnableRaisingEvents = true;
        watcher.Filter = "*.XPD";
    }

    static void watcher_Created(object sender, FileSystemEventArgs e)
    {
        processor.QueueInput(e.FullPath);
    }

}

Wie man sehen kann, der Pfad zur Datei eingegeben wird, in eine Warteschlange für die Verarbeitung, die auf einer anderen Klasse aufgerufen FileProcessor:

class FileProcessor
{
    private Queue<string> workQueue;
    private Thread workerThread;
    private EventWaitHandle waitHandle;

    public FileProcessor()
    {
        workQueue = new Queue<string>();
        waitHandle = new AutoResetEvent(true);
    }

    public void QueueInput(string filepath)
    {
        workQueue.Enqueue(filepath);

        if (workerThread == null)
        {
            workerThread = new Thread(new ThreadStart(Work));
            workerThread.Start();
        }

        else if (workerThread.ThreadState == ThreadState.WaitSleepJoin)
        {
            waitHandle.Set();
        }
    }

    private void Work()
    {
        while (true)
        {
            string filepath = RetrieveFile();

            if (filepath != null)
                ProcessFile(filepath);
            else
                waitHandle.WaitOne();
        }
    }

    private string RetrieveFile()
    {
        if (workQueue.Count > 0)
            return workQueue.Dequeue();
        else
            return null;
    }

    private void ProcessFile(string filepath)
    {
        string xName = Path.GetFileName(filepath);
        string fName = Path.GetFileNameWithoutExtension(filepath);

        string gfolder = specified path;            
        bool fileInUse = true;
        string line;
        string[] itemArray = null;
        int i = 0;


        #region Declare Db variables

        //variables for each field of the database is created here

        #endregion


        #region Populate array

        while (fileInUse == true)
        {
            FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read,           
                                           FileShare.ReadWrite);

            StreamReader reader = new StreamReader(fs);

            itemArray = new string[75];

            while (!reader.EndOfStream == true)
            {
                line = reader.ReadLine();
                itemArray[i] = line;
                i++;
            }
            fs.Flush();
            reader.Close();
            reader.Dispose();
            i = 0;
            fileInUse = false;
        }

        #endregion

        #region Assign Db variables

        //here all the variables get there values from the array

        #endregion

        #region MySql Connection

        //here the connection to mysql is made and the variables are inserted into the db

        #endregion

        #region Test and Move file

        if (System.IO.File.Exists(gfolder + xName))
        {
            System.IO.File.Delete(gfolder + xName);
        }

        Directory.Move(filepath, gfolder + xName);

        #endregion

    }
}

Ich das problem bekommen, tritt in den Füllen-array-region. Ich lese viel von anderen threads und führen zu glauben, dass durch das Spülen des Datei-stream helfen würde...

Bin auch am überlegen, das hinzufügen einer try..catch, wenn die Datei erfolgreich war, wird die Datei verschoben, um gfolder und wenn es fehlgeschlagen ist, bewegt, um bfolder

Jede Hilfe wäre genial

Tx

  • Sieht aus wie eine Art race-condition. Wenn VS Pausen auf die Ausnahme, prüfen Sie in der Ansicht->Debug->Threads und sehen, ob es ein anderes mit einer Datei, die in Verwendung immer noch. EDIT: Auch die FileStream-wird nicht Entsorgt, versuchen Sie es in ein mit {...}
  • Nicht, dass ich keine Ahnung, was ist das problem, aber nur zur Klarstellung für die anderen: Wann genau bekommst du die Ausnahme? Wenn mit dem reader?
  • Nicht sicher, während (fileInUse == true) Anweisung. Versuchen Sie eine using(FileStream fs = FileStream(...)) Anweisung hier statt.
Schreibe einen Kommentar