/ Evento de criação do FileWatcher não disparado - c #

Evento de criação do FileWatcher não disparado - c #

Eu escrevi um serviço filewatcher para monitorar umdiretório recursivamente, e se houver alteração do conteúdo do arquivo .txt ou novos arquivos .txt criados no diretório, ele copiará o arquivo para uma pasta central. Mas eu encontrei algum problema no meu programa.

Sempre que há um.alteração do conteúdo do arquivo txt, meu programa funciona bem. No entanto, quando há um novo arquivo .txt criado no diretório, o evento criado nunca foi disparado. Abaixo está o meu código, você poderia por favor me ajudar com este problema? Desde já, obrigado!

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()
{

}
}
}

Respostas:

1 para resposta № 1

Eu acho que há um problema no seu NotifyFilter. Você precisa adicionar NotifyFilters.FileName para obter o evento criado. Eu poderia repordá-lo em uma pequena solução.