https://github.com/YouXianMing

[Python] 文件扫描

文件扫描

 

下载

https://github.com/YouXianMing/FileManager

 

细节

1. 基于Python 3.60,其他版本未测试

2. 支持扫描深度,不设置则扫描全部,设置了值,则扫描具体的层级

 

源码

import os
import time


class FileObject:
    """
    文件对象
    """

    def __init__(self, filePath):
        """
        创建FileObject对象
        :param filePath: 文件路径
        """

        self.__tree_file_objects = None
        self.__scan_depth = None

        self.__exists = False
        self.__file_path = None
        self.__is_file = None
        self.__is_dir = None
        self._is_link = None
        self.__size = None
        self.__last_modification_time = None
        self.__last_access_time = None
        self.__metadata_change_time = None
        self.__file_name = None
        self.__dir_name = None

        if os.path.exists(filePath):

            self.__scan_depth = 0
            self.__exists = True
            self.__file_path = filePath
            self.__is_file = os.path.isfile(filePath)
            self.__is_dir = os.path.isdir(filePath)
            self._is_link = os.path.islink(filePath)
            self.__size = os.path.getsize(filePath)
            self.__last_modification_time = os.path.getmtime(filePath)
            self.__last_access_time = os.path.getatime(filePath)
            self.__metadata_change_time = os.path.getctime(filePath)
            self.__file_name = os.path.basename(filePath)
            self.__dir_name = os.path.dirname(filePath)

            if self.__is_dir:
                self.__tree_file_objects = []

    @property
    def scan_depth(self):
        """
        扫描深度的设置
        :return: 设置的扫描深度
        """
        return self.__scan_depth

    @scan_depth.setter
    def scan_depth(self, depth):
        self.__scan_depth = depth

    @property
    def tree_file_objects(self):
        """
        树形对象结构列表
        :return: 数组
        """
        return self.__tree_file_objects

    @tree_file_objects.setter
    def tree_file_objects(self, fileList):

        self.__tree_file_objects = fileList

    @property
    def exists(self):
        """
        文件是否存在
        :return: 存在返回True,不存在返回False
        """
        return self.__exists

    @property
    def file_path(self):
        """
        文件路径(初始化成功之后可取)
        :return: 初始化成功则有路径,没有初始化成功则没有路径
        """
        return self.__file_path

    @property
    def is_file(self):
        """
        是否是文件(初始化成功之后可取)
        :return: 未初始化成功返回None,初始化成功时,是文件返回True,不是文件返回False
        """
        return self.__is_file

    @property
    def is_dir(self):
        """
        是否是文件夹(初始化成功之后可取)
        :return: 未初始化成功返回None,初始化成功时,是文件夹返回True,不是文件返回False
        """
        return self.__is_dir

    @property
    def is_link(self):
        """
        是否是link(初始化成功之后可取)
        :return: 未初始化成功返回None,初始化成功时,是link返回True,不是文件返回False
        """
        return self._is_link

    @property
    def size(self):
        """
        文件大小(初始化成功之后可取)
        :return: 未初始化成功返回None,初始化成功时,返回文件大小
        """
        return self.__size

    @property
    def last_modification_time(self):
        """
        最后修改时间(初始化成功之后可取)
        :return: 未初始化成功返回None,初始化成功时,返回最后修改时间
        """
        return self.__last_modification_time

    @property
    def last_access_time(self):
        """
        最后操作时间(初始化成功之后可取)
        :return: 未初始化成功返回None,初始化成功时,返回最后操作时间
        """
        return self.__last_access_time

    @property
    def metadata_change_time(self):
        """
        最后元数据修改时间(初始化成功之后可取)
        :return: 未初始化成功返回None,初始化成功时,返回最后元数据修改时间
        """
        return self.__metadata_change_time

    @property
    def file_name(self):
        """
        文件名(初始化成功之后可取)
        :return: 未初始化成功返回None,初始化成功时,返回文件名
        """
        return self.__file_name

    @property
    def dir_name(self):
        """
        文件夹名(初始化成功之后可取)
        :return: 未初始化成功返回None,初始化成功时,返回文件夹名
        """
        return self.__dir_name

    def show_info(self):

        if self.exists:
            string = "[%s]\n" % self.file_name
            string += "------------------------------------------\n"
            string += "filePath             : %s\n" % self.file_path
            string += "size                 : %.2f kb\n" % (self.size / 1024.0)
            string += "isDir                : %s\n" % self.is_dir
            string += "isFile               : %s\n" % self.is_file
            string += "isLink               : %s\n" % self.is_link
            string += "lastAccessTime       : %s\n" % time.strftime('%Y-%m-%d %H:%M:%S %A',
                                                                    time.localtime(self.last_access_time))
            string += "lastModificationTime : %s\n" % time.strftime('%Y-%m-%d %H:%M:%S %A',
                                                                    time.localtime(self.last_modification_time))
            string += "metadataChangeTime   : %s\n" % time.strftime('%Y-%m-%d %H:%M:%S %A',
                                                                    time.localtime(self.metadata_change_time))
            string += "------------------------------------------\n"
            print(string)


class FileObjectManager:
    """
    用来扫描FileObject的类
    """

    def __init__(self, rootFile):

        self.rootFile = None

        if isinstance(rootFile, FileObject):
            self.rootFile = rootFile

    def all_file_objects(self):
        """
        获取扫描出来的文件
        :return: 扫描文件的数组
        """

        filesList = []

        if self.rootFile:
            FileObjectManager.__get_all_files(self.rootFile, filesList)

        return filesList

    def scan_with_depth(self, depth=999999):
        """
        开始扫描
        :param depth: 扫描深度
        :return: FileObjectManager对象本身
        """

        if self.rootFile:

            # 扫描之前清空rootFile中的数组的数据
            self.rootFile.tree_file_objects = []
            self.__scan_with_depth(self.rootFile, depth)

        return self

    @staticmethod
    def __get_all_files(rootFile, filesList):
        """
        静态方法:获取所有文件
        :param rootFile: FileObject对象,作为rootFile传入
        :param filesList: 集合
        :return: 无
        """

        # 判断rootFile是否是File类型
        if not isinstance(rootFile, FileObject):
            assert False, 'rootFile不是FileObject类型.'

        if type(filesList) != list:
            assert False, 'filesList不是List类型'

        # 遍历获取所有的文件
        for tmpFile in rootFile.tree_file_objects:

            filesList.append(tmpFile)
            if tmpFile.is_dir:
                FileObjectManager.__get_all_files(tmpFile, filesList)

    @staticmethod
    def __scan_with_depth(rootFile, depth):
        """
        静态方法:递归使用的扫描方法
        :param rootFile: 最为rootFile的FileObject对象
        :param depth: 扫描深度
        :return: 无
        """

        # 如果扫描等级超过了depth,则不扫描了
        if rootFile.scan_depth >= depth:
            return

        # 如果rootFile是文件夹
        if rootFile.is_dir:

            # 获取当前文件夹下的所有子文件
            filePathList = os.listdir(rootFile.file_path)

            # 遍历文件并创建文件夹
            for fileName in filePathList:

                # 创建FileObject对象
                file = FileObject(os.path.join(rootFile.file_path, fileName))

                # 设置扫描深度
                file.scan_depth = rootFile.scan_depth + 1

                # 将此文件添加到rootFile的treeFileObjects中
                rootFile.tree_file_objects.append(file)

                # 如果这个文件也是文件夹,则递归调用
                if file.is_dir:
                    FileObjectManager.__scan_with_depth(file, depth)

 

使用

from file_manager import *

# 给定文件夹路径
filesList = FileObjectManager(FileObject("/Users/YouXianMing/Desktop")).scan_with_depth(3).all_file_objects()

# 拼接路径数组
filesString = ""
for file in filesList:

    # 如果是文件,则打印
    if file.is_file:
        print(file.file_path)

 

posted @ 2017-03-13 09:20  YouXianMing  阅读(1095)  评论(0编辑  收藏  举报