/ / FileWatcher作成イベントが起動しない - c#

FileWatcher作成イベントが起動しない - c#

私はファイルウォッチャーサービスを書いて、ディレクトリに再帰的に格納され、.txtファイルの内容が変更された場合、または新しい.txtファイルが作成された場合、そのファイルは中央のフォルダにコピーされます。しかし私は私のプログラムでいくつかの問題を抱えています。

いつでも。txtファイルの内容が変更され、私のプログラムはうまく動作します。ただし、ディレクトリに新しい.txtファイルが作成された場合、作成されたイベントは一度も実行されません。以下は私のコードです、この問題で私を助けてくれますか?前もって感謝します!

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

}
}
}

回答:

回答№1は1

私はあなたのNotifyFilterに問題があると思います。作成したイベントを取得するには、NotifyFilters.FileNameを追加する必要があります。私は小さなソリューションでそれを再現することができました。