Как заставить FileSystemWatcher изменить событие для выполнения только один раз при копировании и вставке нескольких файлов?C # - PullRequest
0 голосов

ситуация такова, у меня есть datagridview, который загружает некоторые данные из XML-файла, поэтому я использую функцию для загрузки этой информации, и в этой функции первые строки делают очистку полного datagridview, я используюFileSystemWatcher для обработки событий, когда новый файл вставляется в определенную папку, и обновления таблицы, он отлично работает, когда я перемещаю или создаю только один файл, но когда я перемещаю файлы в папку или копирую и вставляю, программа выдаетсообщение об ошибке, я думаю, это потому, что событие запускается для каждого скопированного или перемещенного файла, и оно не позволяет завершить метод get files при повторной очистке, я не уверен, что я был чист, я собираюсьчтобы дать вам здесь куски кода, экземпляр FileWatcher, который он инициализирует в конструкторе класса, содержащего метод GetFiles

Метод GetFiles:

 public void GetFiles()
        {
            ds.Clear();
            this.dgArchivos.DataSource = null;
            this.dgArchivos.Rows.Clear();
            this.dgArchivos.Refresh();
            filesPath = Clases.Utilerias.RutaArchivos;
            this.lblFilePath.Text = filesPath;

        DirectoryInfo di = new DirectoryInfo(filesPath);
        var archivos = di.GetFiles("*.pdf");
        DataRow dr;

        //PASO 1 -- Cargamos el XML
        string rutaConfig = string.Format(@"{0}\{1}", filesPath, "config.xml");
        FileInfo fi = new FileInfo(rutaConfig);
        if (fi.Exists)
        {
            ds.ReadXml(rutaConfig);
        }

        //PASO 2 -- Agregamos los archivos que no existan en el xml
        foreach (var archivo in archivos)
        {
            if (!ExisteArchivoEnTabla(archivo.Name)) //antes de cargar los archivos a la tabla es necesario revisar si ya existe en ella
            {
                dr = ds.Tables[0].NewRow();
                dr["FileName"] = archivo.Name;
                ds.Tables[0].Rows.Add(dr);
            }
        }

        this.dgArchivos.DataSource = ds.Tables[0];
        if (dgArchivos.Rows.Count > 0)
        {
            int Total = (dgArchivos.Rows[0].Cells.Count - 2);
            dgArchivos.Columns[Total].DefaultCellStyle.NullValue = "Preview";
        }
        this.getFRunning = false;
    }

FileWatcherClass:

using System;
using System.IO;
using System.Security.Permissions;
using ScanScraping.App;


namespace ScanScraping.Clases
{
    public class FileWatcher
    {
        public static frmProcessFile frm;
        public FileWatcher(frmProcessFile process)
        {
            frm = process;
            Run();
        }

        [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
        public static void Run()
        {
            // Create a new FileSystemWatcher and set its properties.
            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = Clases.Utilerias.RutaArchivos;
            /* Watch for changes in LastAccess and LastWrite times, and
               the renaming of files or directories. */
            watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
               | NotifyFilters.FileName | NotifyFilters.DirectoryName;
            // Only watch text files.
            watcher.Filter = "*.pdf";

            // Add event handlers.
            watcher.Created += new FileSystemEventHandler(OnChanged);
            watcher.Deleted += new FileSystemEventHandler(OnDeleted);

            // Begin watching.
            watcher.EnableRaisingEvents = true;

            // Wait for the user to quit the program.
        }

        // Define the event handlers.
        private static void OnChanged(object source, FileSystemEventArgs e)
        {
            // Specify what is done when a file is changed, created, or deleted.
            Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
            frm.formPadre.xmlCreateOrUpdate();
            frm.GetFiles();
        }

        public static void OnDeleted(object source, FileSystemEventArgs e)
        {
            Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
            string[] file = e.FullPath.Split('\\');
            string fName = file[file.Length - 1];
            frm.updateXML(fName);
            frm.GetFiles();
        }

        private static void OnRenamed(object source, RenamedEventArgs e)
        {
            // Specify what is done when a file is renamed.
            Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
            frm.formPadre.xmlCreateOrUpdate();
            frm.GetFiles();
        }
    }
}
...