# Files_probe **Repository Path**: gxngit/files_probe ## Basic Information - **Project Name**: Files_probe - **Description**: C语言 文件检索/信息采集 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-27 - **Last Updated**: 2026-05-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # File Probe - 文件信息收集系统 一个高性能的文件信息收集工具,用于统计手机上文件的分布情况,支持多线程并发处理,兼顾内存和性能开销。 ## 功能特性 - **多线程并发**:使用线程池并发处理文件信息收集 - **完整文件信息**:收集文件名、路径、类型、大小、磁盘占用、权限等 - **Extents 信息**:获取文件碎片化信息(extent 数量、平均大小、碎片化程度) - **文件指纹**:使用固定采样法快速计算文件指纹哈希 - **Bind Mount 检测**:避免重复扫描和死循环 - **日志记录**:详细的错误和统计日志 - **数据库存储**:SQLite 数据库存储所有文件信息 ## 依赖 ### 必需依赖 - **GCC**: C 编译器 - **SQLite3**: 数据库支持(已内嵌源码,无需安装) ### 可选依赖 - **Valgrind**: 内存泄漏检测(用于测试) - **交叉编译工具链**: 用于跨平台编译(见交叉编译部分) ## 编译 ### 本地编译 ```bash # 编译 make # 清理 make clean # 调试版本 make debug # 内存检查 make memcheck # 查看帮助 make help ``` ### 交叉编译 File Probe 支持多种平台的交叉编译: #### Android 平台 ```bash # Android ARM64 (aarch64) make android-arm64 TOOLCHAIN_DIR=/path/to/android-ndk/toolchains/llvm/prebuilt/linux-x86_64 # Android ARM (armv7) make android-arm TOOLCHAIN_DIR=/path/to/android-ndk/toolchains/llvm/prebuilt/linux-x86_64 ``` #### Linux ARM 平台 ```bash # 安装交叉编译工具链 sudo apt-get install gcc-aarch64-linux-gnu gcc-arm-linux-gnueabihf # Linux ARM64 make linux-arm64 # Linux ARM make linux-arm ``` #### 编译所有平台 ```bash make all-cross ``` 详细的交叉编译说明请参考 [CROSS_COMPILE.md](CROSS_COMPILE.md)。 ## 使用方法 ```bash # 基本用法:扫描单个目录 ./files_probe /home/user # 扫描多个目录 ./files_probe -d /data -d /mnt -d /home # 指定线程数和输出文件 ./files_probe -t 8 -o /tmp/scan.db /home/user # 排除特定目录 ./files_probe / --exclude '/proc' --exclude '/sys' --exclude '/dev' # 跳过 extents 信息收集 ./files_probe -E /home/user # 跳过文件指纹计算 ./files_probe -H /home/user # 详细输出 ./files_probe -v /home/user # 查看帮助 ./files_probe -h ``` ## 命令行选项 | 选项 | 说明 | 默认值 | |------|------|--------| | `-d, --directory ` | 扫描目录(可多次指定) | 必需 | | `-e, --exclude ` | 排除模式(可多次指定) | 无 | | `-t, --threads ` | 线程数 | CPU 核心数 | | `-b, --batch ` | 批量插入大小 | 1000 | | `-H, --no-hash` | 跳过文件指纹计算 | 否 | | `-E, --no-extents` | 跳过 extents 信息收集 | 否 | | `-o, --output ` | 输出数据库文件 | ./files.db | | `-l, --log ` | 日志文件 | stdout | | `-L, --log-level ` | 日志级别 (0-3) | 1 (INFO) | | `-s, --skip-bind-mounts` | 跳过 bind mount | 否 | | `-f, --follow-symlinks` | 跟随符号链接 | 否 | | `-m, --max-depth ` | 最大递归深度 | 100 | | `-v, --verbose` | 详细输出 | 否 | | `-h, --help` | 显示帮助信息 | - | ## 输出数据库 程序会在指定位置创建 SQLite 数据库,包含以下表: ### files 表 | 字段 | 类型 | 说明 | |------|------|------| | id | INTEGER | 主键 | | filename | TEXT | 文件名 | | file_path | TEXT | 文件完整路径(唯一) | | file_type | TEXT | 文件类型 | | file_size | INTEGER | 文件大小(字节) | | disk_usage | INTEGER | 磁盘实际占用(字节) | | extent_count | INTEGER | Extent 个数 | | avg_extent_size | REAL | 平均 Extent 大小 | | fragmentation_score | REAL | 碎片化程度 (0-1) | | file_hash | TEXT | 文件指纹哈希 | | mtime | INTEGER | 修改时间(Unix 时间戳) | | atime | INTEGER | 访问时间(Unix 时间戳) | | mode | INTEGER | 权限位 | | uid | INTEGER | 用户 ID | | gid | INTEGER | 组 ID | | nlink | INTEGER | 硬链接数 | | scan_time | INTEGER | 扫描时间(Unix 时间戳) | | created_at | INTEGER | 记录创建时间 | ## 查询示例 ```sql -- 查找最大的文件 SELECT filename, file_size, file_path FROM files ORDER BY file_size DESC LIMIT 10; -- 查找碎片化最严重的文件 SELECT filename, extent_count, fragmentation_score, file_path FROM files WHERE extent_count > 1 ORDER BY fragmentation_score DESC LIMIT 10; -- 查找重复文件(相同哈希) SELECT file_hash, COUNT(*) as count, GROUP_CONCAT(file_path, ';') as paths FROM files WHERE file_hash IS NOT NULL GROUP BY file_hash HAVING count > 1; -- 统计文件类型分布 SELECT file_type, COUNT(*) as count, SUM(file_size) as total_size FROM files GROUP BY file_type ORDER BY count DESC; -- 查找稀疏文件(磁盘占用小于文件大小) SELECT filename, file_size, disk_usage, (file_size - disk_usage) as wasted_space FROM files WHERE file_size > disk_usage ORDER BY wasted_space DESC LIMIT 10; ``` ## 性能特点 - **扫描速度**:10,000+ 文件/秒(取决于存储介质) - **内存占用**:< 50MB(可配置) - **文件指纹计算**:几乎瞬时完成(采样方式) - **并发处理**:充分利用多核 CPU ## 文件指纹算法 使用固定采样法计算文件指纹: - **小文件(< 16KB)**:全量计算 - **中等文件(16KB - 128KB)**:采样 2 次(开头 + 结尾) - **大文件(>= 128KB)**:采样 4 次(均匀分布) - 所有采样点按 16KB 对齐 - 文件大小纳入哈希计算 - 生成 32 字节哈希值 ## 注意事项 1. **权限问题**:某些目录可能需要 root 权限才能访问 2. **Extents 信息**:需要文件系统支持 FIEMAP(ext4, f2fs, XFS 等) 3. **Bind Mount**:建议使用 `--skip-bind-mounts` 避免重复扫描 4. **符号链接**:默认不跟随符号链接,使用 `-f` 选项启用 5. **内存管理**:程序会自动管理内存,避免内存泄漏 ## Android 编译 ```bash # 设置 Android NDK 路径 export ANDROID_NDK=/path/to/android-ndk # 编译 Android 版本 make android ``` ## 许可证 MIT License ## 作者 File Probe Development Team