ситуация такова, у меня есть 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();
}
}
}