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中所定义
        的文件将被排除在外。

def from_path_except(dir_path, 
            ignore=list(), ignore_ext=list(), ignore_pattern=list()):
        """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中所定义
        的文件将被排除在外。
        """
        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)