# exiftool-test

Java + Maven 封装 `exiftool` 命令,跨平台(Windows 10 / Linux)运行。exiftool 可执行文件按平台捆绑进资源目录,运行时自动选择。

## 放置 exiftool

运行前把对应平台的 exiftool 放入(仅需当前运行平台那个):

- Windows: `src/main/resources/exiftool/windows/exiftool.exe` — 见该目录 `README.txt`
- Linux: `src/main/resources/exiftool/linux/exiftool` + `lib/` — 见该目录 `README.txt`

## 构建与测试

```bash
mvn clean test
```

纯逻辑单测始终运行;真实调用 exiftool 的集成测试在当前平台无可用二进制时自动跳过。

## 运行 Demo

```bash
mvn -q compile exec:java -Dexec.args="333.jpg contains-synthetic-performer"
```

等价于执行:

```
exiftool -overwrite_original -XMP-dc:Subject+="contains-synthetic-performer" 333.jpg
```

## 代码用法

```java
ExifTool exiftool = new ExifTool();

// 便捷方法
ExifToolResult r = exiftool.addSubject("333.jpg", "contains-synthetic-performer");

// 通用执行任意参数
ExifToolResult v = exiftool.execute("-ver");
if (!v.isSuccess()) System.err.println(v.stderr());
```

## 批量处理

给一批文件打**相同**标签/参数,只启动**一个** exiftool 进程(exiftool 冷启动慢,批量务必走这里,不要循环调 `addSubject`):

```java
List<String> files = Arrays.asList("a.jpg", "b.jpg", "c.jpg");

// 便捷:批量追加同一个 Subject
ExifToolResult r = exiftool.addSubjectBatch(files, "contains-synthetic-performer");

// 通用:对每个文件应用相同选项
ExifToolResult r2 = exiftool.executeBatch(
        Arrays.asList("-overwrite_original", "-XMP-dc:Subject+=foo"),
        files);
```

文件数量大导致命令行超长时,内部自动改用 exiftool 的 `-@ 参数文件`(临时文件, UTF-8),规避 Windows/Linux 命令行长度上限,调用方无感知。返回单个 `ExifToolResult`,任一文件出错时 `isSuccess()` 为 false、`stderr()` 含逐文件错误。
