code: def from_path_except(dir_path, 
              ignore=list(), ignore_ext=list(), ignore_pattern=list()):
          
          ignore = [i.lower() for i in ignore]
          ignore_ext = [i.lower() for i in ignore_ext]
          ignore_pattern = [i.lower() for i in ignore_pattern]
          def filter(winfile):
              relpath = os.path.relpath(winfile.abspath, dir_path).lower()
              
              # exclude ignore
              for path in ignore:
                  if relpath.startswith(path):
                      return False
                  
              # exclude ignore extension
              if winfile.ext in ignore_ext:
                  return False
  
              # exclude ignore pattern
              for pattern in ignore_pattern:
                  if pattern in relpath:
                      return False
              
              return True
          
          return FileCollection.from_path_by_criterion(
              dir_path, filter, keepboth=False)
docs: Create a new FileCollection, and select all files except file
          matching ignore-rule::
              
              dir_path = "your/path"
              fc = FileCollection.from_path_except(
                  dir_path, ignore=["test"], ignore_ext=[".log", ".tmp"]
                  ignore_pattern=["some_pattern"])
          
          :param dir_path: the root directory you want to start with
          :param ignore: file or directory defined in this list will be ignored.
          :param ignore_ext: file with extensions defined in this list will be ignored.
          :param ignore_pattern: any file or directory that contains this pattern
            will be ignored.
            
          **中文文档**
          
          选择dir_path下的所有文件, 在ignore, ignore_ext, ignore_pattern中所定义
          的文件将被排除在外。