desktop/electron/localFileBytes.cjs
Rama main · réplica de lectura del repositorio original.
'use strict'
/**
* LOCAL 模式二进制字节读取(技术方案 §5.2):zip / xlsx / docx / 媒体预览的取数通道。
* 路径解析留在 main.cjs(与 local-read-file 共用 resolveWorkspacePath,不建第二套),
* 本模块只承载可单测的类型校验 / 大小上限 / 读取逻辑(localShell.cjs 同款拆分范式)。
*/
const fs = require('fs')
/** 技术方案 §5.2:LOCAL_READ_BYTES_MAX = 64MB(覆盖媒体阈值 50MB 并留余量) */
const DEFAULT_MAX_BYTES = 64 * 1024 * 1024
function formatBytes(n) {
if (n >= 1024 * 1024) return `${(n / 1024 / 1024).toFixed(1)}MB`
if (n >= 1024) return `${(n / 1024).toFixed(1)}KB`
return `${n}B`
}
/**
* 读取本地文件原始字节。
* @param resolvedPath 已由调用方(main.cjs resolveWorkspacePath)解析的绝对路径
* @returns {{ bytes: Buffer, size: number } | { error: string }}
*/
function readFileBytes(resolvedPath, { maxBytes = DEFAULT_MAX_BYTES } = {}) {
const lst = fs.lstatSync(resolvedPath)
if (!lst.isFile() || lst.isSymbolicLink()) {
return { error: '不是普通文件或为符号链接,拒绝读取' }
}
if (lst.size > maxBytes) {
return { error: `文件过大(${formatBytes(lst.size)}),预览上限为 ${formatBytes(maxBytes)}` }
}
const bytes = fs.readFileSync(resolvedPath)
return { bytes, size: bytes.length }
}
module.exports = { readFileBytes, DEFAULT_MAX_BYTES }