# fs.atomic_write

## 功能

先把新内容写入目标同目录的临时文件并刷新到磁盘，再原子替换目标文件；可使用旧内容 SHA-256 检测外部修改，避免静默覆盖。

## 语法

```bt
fs(path).atomic_write(content, expected_sha256)
```

## 参数

| 参数 | 类型 | 必填 | 默认值 | 有效范围 | 说明 |
| ------ | ------ | ------ | ------ | ------ | ------ |
| content | Any | 否 | '' | 可转换为文件内容的 BT 值 | 要写入的新内容；数组和对象会写入 JSON 字符串。 |
| expected_sha256 | String | 否 | 无 | 64 位十六进制文本 | 目标现有内容的 SHA-256；传入后会在创建临时文件前和最终替换前各校验一次。 |

## 返回值

返回 Object。

| 字段 | 类型 | 是否总是存在 | 默认值 | 有效范围 | 含义 |
| ------ | ------ | ------ | ------ | ------ | ------ |
| bytes | Int | 是 | 无 | 0 及以上 | 新内容的字节数。 |
| sha256 | String | 是 | 无 | 64 位小写十六进制文本 | 新内容的 SHA-256。 |
| previous_sha256 | String/empty | 是 | empty | 64 位小写十六进制文本或 empty | 替换前旧内容的 SHA-256；目标原先不存在时为 empty。 |

## 示例

```bt
file = fs('config.bt')
old_hash = crypto(file.read()).sha256()
result = file.atomic_write("name = 'BT 2'\n", old_hash)

// 输出：true
print result.bytes > 0
```

## 注意事项

- 目标父目录必须存在，目标不能是目录。
- 临时文件和目标位于同一目录；只有临时内容完整写入并刷新后才替换目标。
- 传入 `expected_sha256` 时，目标不存在、摘要不匹配或写入期间被外部修改都会报冲突，原内容不会被新内容静默覆盖。
- Windows 使用带写穿透的原子替换；其它平台使用同文件系统重命名。
