# 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