文件夹目录树

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
简化的文件目录树形结构生成器
功能:获取指定目录的所有文件夹和文件,以树形结构格式输出
"""

import os
import sys
from pathlib import Path

def generate_tree(directory, prefix="", include_hidden=False, max_depth=None, current_depth=0):
    """
    递归生成目录树
    
    Args:
        directory: 当前目录路径
        prefix: 前缀字符串,用于树形结构
        include_hidden: 是否包含隐藏文件
        max_depth: 最大递归深度
        current_depth: 当前深度
    """
    if max_depth is not None and current_depth > max_depth:
        return
    
    try:
        # 获取目录内容并排序
        items = sorted(os.listdir(directory), key=lambda x: x.lower())
        
        # 分离文件夹和文件
        dirs = []
        files = []
        for item in items:
            if not include_hidden and item.startswith('.'):
                continue
            
            full_path = os.path.join(directory, item)
            if os.path.isdir(full_path):
                dirs.append(item)
            else:
                files.append(item)
        
        # 处理文件夹
        for i, dir_name in enumerate(dirs):
            is_last = (i == len(dirs) - 1 and len(files) == 0)
            print(prefix + ("└── " if is_last else "├── ") + dir_name + "/")
            
            # 递归处理子文件夹
            next_prefix = prefix + ("    " if is_last else "│   ")
            next_path = os.path.join(directory, dir_name)
            generate_tree(next_path, next_prefix, include_hidden, max_depth, current_depth + 1)
        
        # 处理文件
        for i, file_name in enumerate(files):
            is_last = (i == len(files) - 1)
            print(prefix + ("└── " if is_last else "├── ") + file_name)
    
    except PermissionError:
        print(prefix + "└── [权限不足,无法访问]")

def main():
    """主函数"""
    import argparse
    
    parser = argparse.ArgumentParser(description="生成文件目录树形结构")
    parser.add_argument("directory", nargs="?", default=".", 
                       help="要扫描的目录路径(默认为当前目录)")
    parser.add_argument("-H", "--hidden", action="store_true",
                       help="包含隐藏文件/文件夹")
    parser.add_argument("-d", "--depth", type=int, default=None,
                       help="限制树形结构的最大深度")
    
    args = parser.parse_args()
    
    # 获取目录的绝对路径
    # directory = os.path.abspath(args.directory)
    directory = input("请输入目录路径:")
    
    if not os.path.exists(directory):
        print(f"错误: 目录不存在 - {directory}", file=sys.stderr)
        sys.exit(1)
    
    if not os.path.isdir(directory):
        print(f"错误: 不是目录 - {directory}", file=sys.stderr)
        sys.exit(1)
    
    # 打印根目录
    print(f"目录树: {directory}")
    print("=" * 60)
    print(os.path.basename(directory) + "/")
    
    # 生成树形结构
    generate_tree(directory, include_hidden=args.hidden, max_depth=args.depth)
    
    print("=" * 60)

if __name__ == "__main__":
    main()
posted @ 2026-01-03 13:26  小西贝の博客  阅读(11)  评论(0)    收藏  举报