当前位置:首页>python>Python+PyQt5 实现目录文件扫描与导出工具

Python+PyQt5 实现目录文件扫描与导出工具

  • 2026-02-08 00:47:22
Python+PyQt5 实现目录文件扫描与导出工具
点击上方蓝字订阅!

本文将详细介绍如何使用 Python 和 PyQt5 创建一个功能完整的目录文件扫描器。该工具能够选择目录、递归扫描所有文件、以树形结构展示结果,并将文件列表导出为文本文件。

核心功能实现

在这里插入图片描述

1. 主窗口与界面设计

"""
文件扫描器主程序
功能:选择目录、扫描文件、树形展示、导出TXT
作者:智能助手
日期:2024年1月24日
"""


import os
import sys
from pathlib import Path
from datetime import datetime
from PyQt5.QtCore import Qt, QThread, pyqtSignal, QSize
from PyQt5.QtGui import QFont, QColor, QIcon, QPalette, QLinearGradient
from PyQt5.QtWidgets import *

classFileScannerApp(QMainWindow):
"""主应用程序窗口,负责界面布局和功能协调"""

def__init__(self):
        super().__init__()
        self.current_dir = ""
        self.file_list = []
        self.scanner = None
        self._setup_ui()
        self._setup_styles()
        self.setWindowTitle("文件扫描器")
        self.setGeometry(1001001000700)

def_setup_ui(self):
"""初始化用户界面"""
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        main_layout = QVBoxLayout(central_widget)
        main_layout.setSpacing(10)
        main_layout.setContentsMargins(15151515)

# 标题
        title_label = QLabel("📁 目录文件扫描器")
        title_label.setStyleSheet("font-size: 20px; font-weight: bold; color: #2c3e50;")
        title_label.setAlignment(Qt.AlignCenter)
        main_layout.addWidget(title_label)

# 目录选择区域
        dir_group = QGroupBox("目录设置")
        dir_layout = QHBoxLayout()

        self.dir_label = QLabel("未选择目录")
        self.dir_label.setStyleSheet("color: 
#7f8c8d; padding: 5px; border: 1px solid #ddd; border-radius: 3px;")
        self.dir_label.setMinimumHeight(30)

        self.browse_btn = QPushButton("选择目录")
        self.browse_btn.setFixedWidth(100)
        self.browse_btn.clicked.connect(self.select_directory)

        dir_layout.addWidget(self.dir_label, 1)
        dir_layout.addWidget(self.browse_btn)
        dir_group.setLayout(dir_layout)
        main_layout.addWidget(dir_group)

# 控制按钮区域
        control_group = QGroupBox("操作控制")
        control_layout = QHBoxLayout()

        self.scan_btn = QPushButton("🔍 开始扫描")
        self.scan_btn.setFixedWidth(120)
        self.scan_btn.clicked.connect(self.start_scan)
        self.scan_btn.setEnabled(False)

        self.stop_btn = QPushButton("⏹ 停止")
        self.stop_btn.setFixedWidth(100)
        self.stop_btn.clicked.connect(self.stop_scan)
        self.stop_btn.setEnabled(False)

        self.export_btn = QPushButton("💾 导出TXT")
        self.export_btn.setFixedWidth(120)
        self.export_btn.clicked.connect(self.export_files)
        self.export_btn.setEnabled(False)

        control_layout.addWidget(self.scan_btn)
        control_layout.addWidget(self.stop_btn)
        control_layout.addWidget(self.export_btn)
        control_layout.addStretch()
        control_group.setLayout(control_layout)
        main_layout.addWidget(control_group)

# 进度条
        self.progress_bar = QProgressBar()
        self.progress_bar.setVisible(False)
        main_layout.addWidget(self.progress_bar)

# 文件树显示
        tree_group = QGroupBox("文件列表")
        tree_layout = QVBoxLayout()

        self.file_tree = QTreeWidget()
        self.file_tree.setHeaderLabels(["文件/目录""路径"])
        self.file_tree.setColumnWidth(0300)
        self.file_tree.header().setSectionResizeMode(0, QHeaderView.Interactive)
        self.file_tree.header().setSectionResizeMode(1, QHeaderView.Stretch)

        tree_layout.addWidget(self.file_tree)
        tree_group.setLayout(tree_layout)
        main_layout.addWidget(tree_group, 1)

# 状态栏
        self.status_bar = QStatusBar()
        self.setStatusBar(self.status_bar)
        self.status_label = QLabel("就绪")
        self.status_bar.addWidget(self.status_label)

def_setup_styles(self):
"""设置界面样式"""
        self.setStyleSheet("""
            QMainWindow {
                background-color: #f5f5f5;
            }
            QGroupBox {
                font-weight: bold;
                border: 1px solid #ccc;
                border-radius: 5px;
                margin-top: 10px;
                padding-top: 10px;
            }
            QGroupBox::title {
                subcontrol-origin: margin;
                left: 10px;
                padding: 0 5px 0 5px;
            }
            QPushButton {
                background-color: #3498db;
                color: white;
                border: none;
                padding: 8px 15px;
                border-radius: 4px;
                font-weight: bold;
            }
            QPushButton:hover {
                background-color: #2980b9;
            }
            QPushButton:disabled {
                background-color: #bdc3c7;
                color: #7f8c8d;
            }
            QTreeWidget {
                background-color: white;
                border: 1px solid #ddd;
                border-radius: 3px;
                font-family: 'Microsoft YaHei', 'Segoe UI';
                font-size: 12px;
            }
            QTreeWidget::item {
                padding: 3px;
            }
            QTreeWidget::item:hover {
                background-color: #ecf0f1;
            }
            QTreeWidget::item:selected {
                background-color: #3498db;
                color: white;
            }
        """
)

defselect_directory(self):
"""选择目录"""
        dir_path = QFileDialog.getExistingDirectory(
            self, 
"选择目录",
            str(Path.home()),
            QFileDialog.ShowDirsOnly
        )

if dir_path:
            self.current_dir = dir_path
            self.dir_label.setText(f"已选择: {dir_path}")
            self.scan_btn.setEnabled(True)
            self.clear_file_tree()
            self.status_label.setText("目录已选择,点击开始扫描")

defstart_scan(self):
"""开始扫描文件"""
ifnot self.current_dir ornot os.path.exists(self.current_dir):
            QMessageBox.warning(self, "警告""请先选择有效的目录")
return

        self.clear_file_tree()
        self.scan_btn.setEnabled(False)
        self.browse_btn.setEnabled(False)
        self.stop_btn.setEnabled(True)
        self.export_btn.setEnabled(False)

        self.progress_bar.setVisible(True)
        self.progress_bar.setValue(0)

        self.scanner = FileScanner(self.current_dir)
        self.scanner.progress.connect(self.update_progress)
        self.scanner.finished.connect(self.on_scan_finished)
        self.scanner.error.connect(self.on_scan_error)
        self.scanner.start()

        self.status_label.setText("正在扫描文件...")

defstop_scan(self):
"""停止扫描"""
if self.scanner and self.scanner.isRunning():
            self.scanner.stop()
            self.scanner.wait()

        self.reset_controls()
        self.status_label.setText("扫描已停止")

defupdate_progress(self, current, total, filename):
"""更新扫描进度"""
if total > 0:
            progress = int((current / total) * 100)
            self.progress_bar.setMaximum(total)
            self.progress_bar.setValue(current)

            display_name = filename if len(filename) < 40elsef"{filename[:37]}..."
            self.status_label.setText(f"扫描中: {current}/{total} - {display_name}")

defon_scan_finished(self, file_list):
"""扫描完成处理"""
        self.file_list = sorted(file_list)
        self.build_file_tree()
        self.reset_controls()
        self.export_btn.setEnabled(True)

        self.status_label.setText(f"扫描完成!共找到 {len(self.file_list)} 个文件")
        QMessageBox.information(self, "完成"f"扫描完成!\n找到 {len(self.file_list)} 个文件")

defon_scan_error(self, error_msg):
"""扫描错误处理"""
        QMessageBox.critical(self, "错误"f"扫描失败: {error_msg}")
        self.reset_controls()
        self.status_label.setText(f"错误: {error_msg}")

defreset_controls(self):
"""重置控件状态"""
        self.scan_btn.setEnabled(True)
        self.browse_btn.setEnabled(True)
        self.stop_btn.setEnabled(False)
        self.progress_bar.setVisible(False)

defclear_file_tree(self):
"""清空文件树"""
        self.file_tree.clear()

defbuild_file_tree(self):
"""构建文件树结构"""
ifnot self.file_list:
return

        root_name = os.path.basename(self.current_dir) or self.current_dir
        root_item = QTreeWidgetItem(self.file_tree, [root_name, self.current_dir])
        root_item.setExpanded(True)

for file_path in self.file_list:
            self.add_to_tree(root_item, file_path)

defadd_to_tree(self, parent_item, file_path):
"""添加文件到树中"""
        parts = file_path.split(os.sep)
        current_item = parent_item

for i, part in enumerate(parts):
            found = False
for j in range(current_item.childCount()):
                child = current_item.child(j)
if child.text(0) == part:
                    current_item = child
                    found = True
break

ifnot found:
                full_path = os.path.join(self.current_dir, *parts[:i+1])
                is_file = (i == len(parts) - 1)

                new_item = QTreeWidgetItem(current_item, [part, full_path])
if is_file:
                    new_item.setForeground(0, QColor(01280))

                current_item = new_item

defexport_files(self):
"""导出文件列表到TXT"""
ifnot self.file_list:
            QMessageBox.warning(self, "警告""没有文件可导出")
return

        default_name = f"文件列表_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt"
        file_path, _ = QFileDialog.getSaveFileName(
            self, "保存文件列表",
            str(Path.home() / default_name),
"文本文件 (*.txt);;所有文件 (*)"
        )

if file_path:
try:
with open(file_path, 'w', encoding='utf-8'as f:
                    f.write(f"目录: {self.current_dir}\n")
                    f.write(f"扫描时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
                    f.write(f"文件总数: {len(self.file_list)}\n")
                    f.write("=" * 50 + "\n\n")

for file in self.file_list:
                        f.write(file + "\n")

                QMessageBox.information(self, "成功"f"文件已保存到:\n{file_path}")
                self.status_label.setText(f"已保存: {os.path.basename(file_path)}")

except Exception as e:
                QMessageBox.critical(self, "错误"f"保存失败: {str(e)}")

2. 文件扫描线程

classFileScanner(QThread):
"""后台文件扫描线程,避免界面卡顿"""

    progress = pyqtSignal(int, int, str)  # 当前进度, 总数, 当前文件
    finished = pyqtSignal(list)  # 文件列表
    error = pyqtSignal(str)  # 错误信息

def__init__(self, root_dir):
        super().__init__()
        self.root_dir = root_dir
        self._running = True

defrun(self):
"""线程执行函数"""
try:
ifnot os.path.exists(self.root_dir):
                self.error.emit(f"目录不存在: {self.root_dir}")
return

            file_list = []
            total_files = 0

# 先统计总文件数
for root, dirs, files in os.walk(self.root_dir):
ifnot self._running:
return
                total_files += len(files)

            processed = 0
for root, dirs, files in os.walk(self.root_dir):
ifnot self._running:
return

for file in files:
ifnot self._running:
return

try:
                        full_path = os.path.join(root, file)
                        rel_path = os.path.relpath(full_path, self.root_dir)
                        file_list.append(rel_path)

                        processed += 1
if total_files > 0:
                            self.progress.emit(processed, total_files, rel_path)

except Exception:
continue

if self._running:
                self.finished.emit(file_list)

except Exception as e:
            self.error.emit(str(e))

defstop(self):
"""停止扫描"""
        self._running = False

3. 应用程序入口

defmain():
"""应用程序主函数"""
    app = QApplication(sys.argv)
    app.setApplicationName("文件扫描器")
    app.setFont(QFont("Microsoft YaHei"10))

    window = FileScannerApp()
    window.show()

    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

代码解析与实现细节

界面布局设计

界面采用 QVBoxLayout 和 QHBoxLayout 进行垂直和水平布局,包含以下核心区域:

  1. 标题区域:显示应用程序名称
  2. 目录选择区:显示当前选择的目录路径和浏览按钮
  3. 控制按钮区:开始扫描、停止、导出三个主要功能按钮
  4. 进度显示区:显示扫描进度
  5. 文件树展示区:以树形结构展示目录和文件
  6. 状态栏:显示当前状态信息

树形结构实现原理

文件树的构建采用递归算法,但通过迭代方式实现以避免递归深度限制。对于每个文件的相对路径,按路径分隔符分割,逐级检查并创建树节点:

defadd_to_tree(parent_item, file_path):
"""添加文件到树中的算法实现"""
    parts = file_path.split(os.sep)  # 分割路径
    current_item = parent_item

for i, part in enumerate(parts):
# 检查是否已存在该节点
        found = False
for j in range(current_item.childCount()):
if current_item.child(j).text(0) == part:
                current_item = current_item.child(j)
                found = True
break

# 创建新节点
ifnot found:
            is_file = (i == len(parts) - 1)
            new_item = QTreeWidgetItem(current_item, [part, ""])
if is_file:
                new_item.setForeground(0, QColor(01280))
            current_item = new_item

多线程处理机制

扫描过程在独立线程中执行,避免界面卡顿。使用 QThread 和 pyqtSignal 实现线程间通信:

  1. 进度信号:实时更新扫描进度
  2. 完成信号:扫描完成后传输文件列表
  3. 错误信号:传递扫描过程中的异常信息

线程安全的停止机制通过标志变量控制:

defstop(self):
"""安全的线程停止方法"""
    self._running = False

defrun(self):
"""线程运行循环"""
while self._running and not_finished:
# 扫描逻辑...

文件导出格式

生成的 TXT 文件包含标准化格式:

目录: /path/to/directory
扫描时间: 2024-01-24 10:30:00
文件总数: 1234
==================================================

folder1/file1.txt
folder1/file2.py
folder2/subfolder/document.docx
...

扩展功能建议

1. 添加文件筛选功能

classFilterDialog(QDialog):
"""文件筛选对话框"""

def__init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("文件筛选")
        layout = QVBoxLayout()

# 扩展名筛选
        ext_layout = QHBoxLayout()
        ext_label = QLabel("扩展名:")
        self.ext_input = QLineEdit()
        self.ext_input.setPlaceholderText("例如: txt,py,jpg (逗号分隔)")
        ext_layout.addWidget(ext_label)
        ext_layout.addWidget(self.ext_input, 1)

# 大小筛选
        size_layout = QHBoxLayout()
        size_label = QLabel("最小大小(KB):")
        self.min_size = QSpinBox()
        self.min_size.setRange(0999999)
        size_layout.addWidget(size_label)
        size_layout.addWidget(self.min_size)

        layout.addLayout(ext_layout)
        layout.addLayout(size_layout)

# 按钮
        btn_layout = QHBoxLayout()
        ok_btn = QPushButton("确定")
        cancel_btn = QPushButton("取消")
        ok_btn.clicked.connect(self.accept)
        cancel_btn.clicked.connect(self.reject)
        btn_layout.addWidget(ok_btn)
        btn_layout.addWidget(cancel_btn)

        layout.addLayout(btn_layout)
        self.setLayout(layout)

2. 添加右键菜单功能

classCustomTreeWidget(QTreeWidget):
"""自定义树控件,添加右键菜单"""

def__init__(self, parent=None):
        super().__init__(parent)
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.show_context_menu)

defshow_context_menu(self, position):
"""显示右键菜单"""
        menu = QMenu()

        open_action = QAction("打开文件", self)
        open_folder_action = QAction("打开所在文件夹", self)
        copy_path_action = QAction("复制路径", self)

        menu.addAction(open_action)
        menu.addAction(open_folder_action)
        menu.addSeparator()
        menu.addAction(copy_path_action)

        menu.exec_(self.viewport().mapToGlobal(position))

3. 添加统计信息面板

classStatsPanel(QWidget):
"""统计信息面板"""

def__init__(self, parent=None):
        super().__init__(parent)
        layout = QVBoxLayout()

# 文件类型统计
        self.type_stats = {}
        self.type_label = QLabel("文件类型: 0")

# 大小统计
        self.total_size = 0
        self.size_label = QLabel("总大小: 0 B")

# 时间统计
        self.scan_time = 0
        self.time_label = QLabel("扫描时间: 0s")

        layout.addWidget(self.type_label)
        layout.addWidget(self.size_label)
        layout.addWidget(self.time_label)
        self.setLayout(layout)

defupdate_stats(self, file_list, scan_time):
"""更新统计信息"""
# 计算文件类型分布
        self.type_stats.clear()
for file in file_list:
            ext = os.path.splitext(file)[1].lower()
            self.type_stats[ext] = self.type_stats.get(ext, 0) + 1

# 计算总大小
        self.total_size = 0

# 更新显示
        self.type_label.setText(f"文件类型: {len(self.type_stats)} 种")
        self.time_label.setText(f"扫描时间: {scan_time:.2f}s")

运行说明

安装依赖

pip install PyQt5

运行程序

python file_scanner.py

使用步骤

  1. 点击"选择目录"按钮,选择要扫描的目录
  2. 点击"开始扫描"按钮,开始扫描文件
  3. 在树形结构中浏览扫描结果
  4. 点击"导出TXT"按钮,保存文件列表
  5. 可随时点击"停止"按钮中断扫描

注意事项

  1. 权限问题:某些系统目录可能需要管理员权限才能访问
  2. 符号链接:当前版本不处理符号链接,避免无限循环
  3. 大目录处理:扫描非常大的目录时可能需要较长时间
  4. 内存使用:扫描结果完全存储在内存中,超大型目录需注意内存限制
  5. 编码问题:确保系统支持文件的字符编码

总结

本文实现了一个功能完整的目录文件扫描器,具有以下特点:

  1. 直观的图形界面:基于 PyQt5 的现代化界面
  2. 高效的扫描机制:多线程后台扫描,不阻塞界面
  3. 清晰的树形展示:层次化的文件结构展示
  4. 完整的导出功能:标准化的 TXT 文件输出
  5. 良好的用户体验:进度显示、状态反馈、错误处理

该工具适用于文件整理、项目分析、数据备份等多种场景,可有效提高文件管理效率。通过模块化设计和清晰的代码结构,便于进一步的功能扩展和维护。

 • end • 

陪伴是最长情的告白

 为你推送最实用的资讯 

识别二维码 关注我们 

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 01:22:33 HTTP/2.0 GET : https://f.mffb.com.cn/a/467717.html
  2. 运行时间 : 0.211911s [ 吞吐率:4.72req/s ] 内存消耗:4,579.92kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=5cdb67019d330e26f8cc3b487e9c2bfa
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000985s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001546s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000711s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000673s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001296s ]
  6. SELECT * FROM `set` [ RunTime:0.000575s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001576s ]
  8. SELECT * FROM `article` WHERE `id` = 467717 LIMIT 1 [ RunTime:0.001304s ]
  9. UPDATE `article` SET `lasttime` = 1770484954 WHERE `id` = 467717 [ RunTime:0.012343s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000698s ]
  11. SELECT * FROM `article` WHERE `id` < 467717 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001062s ]
  12. SELECT * FROM `article` WHERE `id` > 467717 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001039s ]
  13. SELECT * FROM `article` WHERE `id` < 467717 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002083s ]
  14. SELECT * FROM `article` WHERE `id` < 467717 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001738s ]
  15. SELECT * FROM `article` WHERE `id` < 467717 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.005891s ]
0.215218s