/ / Evénement de création FileWatcher non déclenché - c #

Evénement de création FileWatcher non déclenché - c #

J'ai écrit un service FileWatcher pour surveiller unrépertoire récursif, et si le contenu du fichier .txt est modifié ou si de nouveaux fichiers .txt sont créés dans le répertoire, le fichier sera copié dans un dossier central. Mais je rencontre un problème dans mon programme.

Quand il y a un.Le contenu du fichier txt change, mon programme fonctionne bien. Cependant, lorsqu'un nouveau fichier .txt est créé dans le répertoire, l'événement créé ne s'est jamais déclenché. Voici mon code, pourriez-vous m'aider s'il vous plaît avec ce problème? Merci d'avance!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FileWatcher
{
public partial class FileWatcher : ServiceBase
{
private string des = @"c:b";
private FileSystemWatcher watcher;
public FileWatcher()
{
InitializeComponent();
watcher = new FileSystemWatcher();
}

protected override void OnStart(string[] args)
{


watcher.Path = @"C:a";
/* Watch for changes in LastAccess and LastWrite times, and
the renaming of files or directories. */
watcher.NotifyFilter = NotifyFilters.Size | NotifyFilters.LastWrite;

// Only watch text files.
watcher.Filter = "*.txt";

// Add event handlers.
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnCreated);


// Begin watching.
watcher.IncludeSubdirectories = true;
watcher.EnableRaisingEvents = true;
}
private void OnChanged(object sender, FileSystemEventArgs e) {

string fileName = Path.GetFileName(e.Name);
string destFile = System.IO.Path.Combine(des, fileName);
using (System.IO.StreamWriter f = new System.IO.StreamWriter(@"C:log.txt", true))
{
f.WriteLine(fileName);
}


using (System.IO.StreamWriter f = new System.IO.StreamWriter(@"C:log.txt", true))
{
f.WriteLine(destFile);
}

System.IO.File.Copy(e.FullPath, destFile, true);

}

private void OnCreated(object sender, FileSystemEventArgs e) {
using (System.IO.StreamWriter f = new System.IO.StreamWriter(@"C:log.txt", true))
{
f.WriteLine("create new");
}

FileAttributes attr = File.GetAttributes(e.FullPath);
//detect whether its a directory or file
if ((attr & FileAttributes.Directory) == FileAttributes.Directory) {
foreach (string file in Directory.GetFiles(e.FullPath))
{
var eventArgs = new FileSystemEventArgs(
WatcherChangeTypes.Created,
Path.GetDirectoryName(file),
Path.GetFileName(file));
OnCreated(sender, eventArgs);
}


}
else {
string fileName = e.Name;
string destFile = System.IO.Path.Combine(des, fileName);
System.IO.File.Copy(e.FullPath, destFile, true);
}


}


protected override void OnStop()
{

}
}
}

Réponses:

1 pour la réponse № 1

Je pense qu'il y a un problème dans votre filtre NotifyFilter. Vous devez ajouter NotifyFilters.FileName pour obtenir l'événement créé. Je pourrais le ramener dans une petite solution.