Ctrl K
ComunidadGuías…

desktop/electron/localFileBytes.cjs

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
'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 }