/// <summary> /// ファイルが削除されたときに、このクラスの Deleted イベントを発生する。 /// </summary> /// <param name="sender">イベントの発生元 (FileSystemWatcher)</param> /// <param name="args">イベント発生元からの引数</param> private void onDeleted(Object sender, FileSystemEventArgs e) { string lowerFullPath = e.FullPath.ToLower(); if (this.files.Contains(lowerFullPath)) { this.files.Remove(lowerFullPath); TvProgram tvprg = new TvProgram(e.FullPath, false); TvProgramEventArgs tvargs = new TvProgramEventArgs(WatcherChangeTypes.Deleted, tvprg); this.Deleted(this, tvargs); } }
/// <summary> /// ファイルが更新されたときに、このクラスの Changed イベントを発生する。 /// </summary> /// <param name="sender">イベントの発生元 (FileSystemWatcher)</param> /// <param name="args">イベント発生元からの引数</param> private void onChanged(Object sender, FileSystemEventArgs e) { Thread.Sleep(5); string lowerFullPath = e.FullPath.ToLower(); if (this.files.Contains(lowerFullPath)) { try { TvProgram tvprg = new TvProgram(e.FullPath); TvProgramEventArgs tvargs = new TvProgramEventArgs(WatcherChangeTypes.Changed, tvprg); // ファイルを読み取る前に消えた場合、例外が発生しうるけど、とりあえず気にしない。 this.Changed(this, tvargs); } catch (UnauthorizedAccessException) { } // アクセス権限がない場合は無視する catch (FileNotFoundException) { } // ファイルが見当たらなくても無視して、Deleted イベントに任せる。 } }
private void onRenamed(object sender, RenamedEventArgs e) { Thread.Sleep(5); string lowerNewFullPath = e.FullPath.ToLower(); string lowerOldFullPath = e.OldFullPath.ToLower(); bool IsNewFullPathExist = this.files.Contains(lowerNewFullPath); bool IsOldFullPathExist = this.files.Contains(lowerOldFullPath); if (!IsNewFullPathExist && IsOldFullPathExist) { this.files.Remove(lowerOldFullPath); try { TvProgram tvprg = new TvProgram(e.FullPath); // ファイルを読み取る前に消えた場合、例外が発生しうるけど、とりあえず気にしない。 TvProgramEventArgs tvargs = new TvProgramEventArgs(WatcherChangeTypes.Created, tvprg); TvProgram otvprg = new TvProgram(e.OldFullPath, false); TvProgramRenamedEventArgs tvrargs = new TvProgramRenamedEventArgs(WatcherChangeTypes.Renamed, tvprg, otvprg); this.Renamed(this, tvrargs); } catch (UnauthorizedAccessException) { } // アクセス権限がない場合は無視する catch (FileNotFoundException) { } // ファイルが見当たらなくても無視して、Deleted イベントに任せる。 this.files.Add(lowerNewFullPath); } else if (IsNewFullPathExist && IsOldFullPathExist) { this.onDeleted(sender, new FileSystemEventArgs(System.IO.WatcherChangeTypes.Deleted, this.Path, e.OldName)); this.onChanged(sender, e); } else if (IsNewFullPathExist && !IsOldFullPathExist) { this.onChanged(sender, e); } else { this.onCreated(sender, e); } }
/// <summary> /// 指定ディレクトリ以下のファイルを探索し、ファイル発見ごとにこのクラスの Found イベントを発生する。 /// 更新日時が新しいものから順にイベントを発生する。 /// </summary> /// <param name="curdirstr">ファイル検索対象のフォルダー</param> private void SearchAllFiles(String currentdir, bool isRecursionEntry) { // 順次 Found イベントを発生させるため、再帰的なファイル検索を独自に実装した。 int allnum = 0; int proceednum = 0; if (isRecursionEntry) { DirectoryInfo dirInfo = new DirectoryInfo(currentdir); allnum = dirInfo.GetFileSystemInfos().Length; } // 直下のファイルの検索 try { DirectoryInfo dirInfo = new DirectoryInfo(currentdir); List <FileInfo> fileList = new List <FileInfo>(dirInfo.GetFiles(TvProgramWatcher.FILE_NAME_FILTER)); //fileList.Sort(delegate(FileInfo x, FileInfo y) { return -x.LastWriteTime.CompareTo(y.LastWriteTime); }); fileList.Sort(delegate(FileInfo x, FileInfo y) { return(-x.FullName.CompareTo(y.FullName)); }); foreach (FileInfo f in fileList) { lock (lockTarget) { if (!this.files.Contains(f.FullName.ToLower())) { try { TvProgram tvprg = new TvProgram(f.FullName); TvProgramEventArgs e = new TvProgramEventArgs(WatcherChangeTypes.Created, tvprg); this.Found(this, e); this.files.Add(f.FullName.ToLower()); } catch (UnauthorizedAccessException) { Console.WriteLine("アクセス権限がないファイルを無視しました。"); } catch (FileNotFoundException) { Console.WriteLine("処理中にファイルが削除されました。"); } } } } if (isRecursionEntry) { proceednum++; this.SearchProgress = Math.Min((1.0 * proceednum) / allnum, 1.0); } } catch (UnauthorizedAccessException) { Console.WriteLine("アクセス権限がないフォルダを無視しました。"); } catch (DirectoryNotFoundException) { Console.WriteLine("処理中にフォルダが削除されました。"); } // サブディレクトリの検索 try { DirectoryInfo dirInfo = new DirectoryInfo(currentdir); List <DirectoryInfo> subDirList = new List <DirectoryInfo>(dirInfo.GetDirectories()); //subDirList.Sort(delegate(DirectoryInfo x, DirectoryInfo y) { return -x.LastWriteTime.CompareTo(y.LastWriteTime); }); subDirList.Sort(delegate(DirectoryInfo x, DirectoryInfo y) { return(-x.FullName.CompareTo(y.FullName)); }); foreach (DirectoryInfo subdir in subDirList) { SearchAllFiles(subdir.FullName, false); if (isRecursionEntry) { proceednum++; this.SearchProgress = Math.Min((1.0 * proceednum) / allnum, 1.0); } } } catch (UnauthorizedAccessException) { Console.WriteLine("アクセス権限がないフォルダを無視しました。"); if (isRecursionEntry) { proceednum++; this.SearchProgress = Math.Min((1.0 * proceednum) / allnum, 1.0); } } catch (DirectoryNotFoundException) { Console.WriteLine("処理中にフォルダが削除されました。"); if (isRecursionEntry) { proceednum++; this.SearchProgress = Math.Min((1.0 * proceednum) / allnum, 1.0); } } }