// ============================================================
 // <T>从监视器中移除一个监视文件。</T>
 //
 // @param info 文件信息
 // ============================================================
 public boolean remove(FFileInfo info) {
   if (null != info) {
     _files.remove(info.fileName());
     return true;
   }
   return false;
 }
 // ============================================================
 // <T>从监视器中移除一个监视文件。</T>
 //
 // @param fileName 文件名称
 // ============================================================
 public boolean remove(String fileName) {
   FFileInfo info = _files.get(fileName);
   if (null != info) {
     _files.remove(fileName);
     return true;
   }
   return false;
 }
 // ============================================================
 // <T>执行监视器的逻辑。</T>
 //
 // @return 处理结果
 // ============================================================
 @Override
 public boolean onExecute() {
   // 检查文件集合
   if (_files.isEmpty()) {
     return false;
   }
   // 检查变更的文件
   FFileInfos removes = null;
   int count = _files.count();
   for (int n = 0; n < count; n++) {
     FFileInfo info = _files.value(n);
     if (onFilter(info)) {
       if (info.exists()) {
         if (info.storeTest(_storeInterval)) {
           // 响应存储的文件
           try {
             doFileSave(info);
           } catch (Exception e) {
             _logger.error(e, "File save event error (file={1})", info.fileName());
           }
           info.stored();
         } else if (info.isModified()) {
           // 响应变更的文件
           try {
             doFileChange(info);
           } catch (Exception e) {
             _logger.error(e, "File change event error (file={1})", info.fileName());
           }
           info.refresh();
         }
       } else {
         // 响应被删除的文件
         try {
           doFileRemove(info);
         } catch (Exception e) {
           _logger.error(e, "File remove event error (file={1})", info.fileName());
         }
         if (null == removes) {
           removes = new FFileInfos();
         }
         removes.push(info);
       }
     }
   }
   // 移除文件集合
   if (null != removes) {
     for (FFileInfo info : removes.values()) {
       _files.remove(info.fileName());
     }
   }
   return true;
 }