首先 ,创建全局变量的FileSystemWatcher
private FileSystemWatcher watch = new FileSystemWatcher();
watch.Path = Path;//设定路径
watch.Filter = "*.*";
watch.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.LastAccess;
watch.Renamed += new RenamedEventHandler(watcher_Renamed);
watch.Deleted += new FileSystemEventHandler(DeleteWatch);
watch.Created += new FileSystemEventHandler(CreateWatch);
watch.Changed += new FileSystemEventHandler(ChangeWatch);
watch.EnableRaisingEvents = true;
应用方式:
int ChangeCount = 0;//设定第二次触发时进行数据处理
public void ChangeWatch(object sender, FileSystemEventArgs e)
{
Thread.Sleep(200);
watch.EnableRaisingEvents = false;
if (ChangeCount > 0)
{
if (e.FullPath.Contains("JPG") || e.FullPath.Contains("jpg"))
{
FileInfo OneFile = new FileInfo(e.FullPath);
if (PhotoFiles.Where(x => e.FullPath.Contains(x.Name)).Count() < 1)
{
GetNewFileDo(OneFile);
}
}
ChangeCount = 0;
}
else
{
ChangeCount++;
}
watch.EnableRaisingEvents = true;
}
避免触发两遍的问题?
首先设置NotifyFilter为LastWrite,这个就屏蔽了因为杀毒软件等各种外部因素导致Changed事件被触发。
然后设置它的EnableRaisingEvents属性如下:
private void fsw_Changed(object sender,EventArgs e)
{
fsw.EnableRaisingEvents = false;
LoadTreeViewData();
fsw.EnableRaisingEvents = true;
}
这样,先设置为false然后处理完文件之后再设置为true即可。
其中
static void watcher_Renamed(object sender, RenamedEventArgs e)
{
Console.ForegroundColor = ConsoleColor.Magenta;
Console.Write(e.ChangeType);
Console.ForegroundColor = ConsoleColor.White;
Console.Write(" ");
Console.Write(e.OldName);
Console.Write(e.OldFullPath);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write(" ");
Console.Write(e.Name);
Console.Write(e.FullPath);
Console.Write(Thread.CurrentThread.Name);
Console.Write("\r\n");
}
关于文件的判定操作:
#region [ 检测文件是否占用 ]
/// <summary>
/// 检测文件是否占用
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
static bool IsFileReady(string filename)
{
var fi = new FileInfo(filename);
FileStream fs = null;
try
{
fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.None);
return true;
}
catch (IOException)
{
return false;
}
finally
{
if (fs != null)
fs.Close();
}
}
#endregion
另一个比较全面的操作方法:
private static volatile object _lock = true;
static void onFileSystem_Changed(object sender, FileSystemEventArgs e)
{
lock (_lock)
{
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.Write("[");
Console.Write(DateTime.Now.ToString("HH:mm:ss"));
Console.Write("] ");
switch (e.ChangeType.ToString().ToLower())
{
case "created":
//while (!IsFileReady(e.FullPath))
//{
// if (!File.Exists(e.FullPath))
// return;
// Thread.Sleep(100);
//}
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(e.ChangeType);
Console.ForegroundColor = ConsoleColor.White;
Console.Write(" ");
Console.Write(e.Name);
Console.Write(" ");
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.Write(e.FullPath);
break;
case "deleted":
Console.ForegroundColor = ConsoleColor.Red;
Console.Write(e.ChangeType);
Console.ForegroundColor = ConsoleColor.White;
Console.Write(" ");
Console.Write(e.Name);
Console.Write(" ");
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.Write(e.FullPath);
break;
case "changed":
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write(e.ChangeType);
Console.ForegroundColor = ConsoleColor.White;
Console.Write(" ");
Console.Write(e.Name);
Console.Write(" ");
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.Write(e.FullPath);
break;
}
Console.Write("\r\n");
}
}
static void watcher_Renamed(object sender, RenamedEventArgs e)
{
Console.ForegroundColor = ConsoleColor.Magenta;
Console.Write(e.ChangeType);
Console.ForegroundColor = ConsoleColor.White;
Console.Write(" ");
Console.Write(e.OldName);
Console.Write(e.OldFullPath);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write(" ");
Console.Write(e.Name);
Console.Write(e.FullPath);
Console.Write(Thread.CurrentThread.Name);
Console.Write("\r\n");
}
}