鸿蒙开发笔记:Core File Kit在美颜相机中的文件管理实践

开发场景需求
在"拍摄美颜相机"应用中,用户照片、滤镜配置及缓存文件的高效管理直接影响应用性能。Core File Kit 作为鸿蒙核心文件管理套件,解决了以下关键问题:
拍摄照片的安全存储
滤镜资源的快速加载
缓存文件的智能清理

// 核心实现与代码示例
// 安全照片存储
typescript

// 照片存储服务(PhotoService.ets)  
import fs from '@ohos.file.fs';  
import photoAccessHelper from '@ohos.file.photoAccessHelper';  

// 创建加密照片目录  
const createSecureAlbum = async () => {  
  const rootDir = globalThis.context.filesDir;  
  const albumPath = `${rootDir}/SecurePhotos`;  
  
  // 检查并创建加密目录  
  if (!fs.accessSync(albumPath)) {  
    fs.mkdirSync(albumPath);  
    // 设置目录安全属性  
    fs.setSecurity(albumPath, {  
      encrypt: true,  
      securityLevel: fs.SecurityLevel.S3  
    });  
  }  
  return albumPath;  
};  

// 保存加密照片  
async function savePhoto(image: image.PixelMap) {  
  const album = await createSecureAlbum();  
  const timestamp = new Date().getTime();  
  const filePath = `${album}/${timestamp}.jpg`;  
  
  // 转换并压缩  
  const imagePacker = image.createImagePacker();  
  const options: image.PackingOption = {  
    format: "image/jpeg",  
    quality: 95  
  };  
  const buffer = await imagePacker.packing(image, options);  
  
  // 写入加密文件  
  fs.writeSync(filePath, buffer);  
  console.info(`照片已安全存储: ${filePath}`);  
  
  // 添加到系统相册(需用户授权)  
  const asset = await photoAccessHelper.createAsset(filePath);  
  return asset.uri;  
}  
// 滤镜资源预加载
typescript

// 滤镜资源管理器(FilterAssets.ets)  
async function loadFilterAssets() {  
  const filtersDir = `${globalThis.context.resourceDir}/filters`;  
  const fileList = fs.listFileSync(filtersDir);  
  
  // 创建内存映射加速读取  
  const mmapOptions: fs.MMapOptions = {  
    offset: 0,  
    size: fs.statSync(filtersDir).size,  
    mapProt: fs.MapProt.READ_ONLY  
  };  
  const buffer = fs.mmap(fileList[0], mmapOptions);  
  
  // 解析滤镜配置  
  const filterConfig = JSON.parse(buffer.toString());  
  FilterCache.preload(filterConfig);  
}  

// 首次启动时初始化  
onAppInit() {  
  taskpool.execute(loadFilterAssets);  
}  
// 智能缓存清理
typescript

// 缓存管理服务(CacheManager.ets)  
function autoCleanCache() {  
  const cacheDir = globalThis.context.cacheDir;  
  const threshold = 100 * 1024 * 1024; // 100MB上限  
  
  // 获取缓存大小  
  const stats = fs.statSync(cacheDir);  
  if (stats.size < threshold) return;  
  
  // 按LRU策略清理  
  const files = fs.listFileSync(cacheDir);  
  files.sort((a, b) =>  
    fs.statSync(b).mtime - fs.statSync(a).mtime  
  );  
  
  let cleanedSize = 0;  
  for (let i = 20; i < files.length; i++) { // 保留最新20个  
    const size = fs.statSync(files[i]).size;  
    fs.unlinkSync(files[i]);  
    cleanedSize += size;  
    if (stats.size - cleanedSize < threshold) break;  
  }  
}  

// 关键特性应用
// 文件加密存储
typescript

// 读取加密照片  
async function readSecurePhoto(uri: string) {  
  const file = fs.openSync(uri, fs.OpenMode.READ_ONLY);  
  // 验证安全级别  
  if (fs.getSecurity(uri).securityLevel < fs.SecurityLevel.S2) {  
    throw new Error('非安全文件');  
  }  
  const buffer = fs.readSync(file.fd);  
  fs.closeSync(file);  
  return image.createPixelMap(buffer);  
}  
// 断点续传支持
typescript

// 滤镜包下载  
async function downloadFilterPack(url: string) {  
  const tempFile = `${globalThis.context.cacheDir}/filter_temp.zip`;  
  const file = fs.openSync(tempFile, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);  
  
  // 设置断点位置  
  let offset = fs.statSync(tempFile).size;  
  const response = await http.createHttp().request(url, {  
    offset,  
    header: { Range: `bytes=${offset}-` }  
  });  
  
  // 写入文件流  
  const writer = fs.createStream(tempFile, 'r+');  
  writer.seek(offset);  
  await writer.write(response.result);  
  writer.close();  
}  

// 性能优化实践
// 零拷贝传输
typescript

// 照片预览快速加载  
function loadPreview(uri: string) {  
  const srcFd = fs.openSync(uri, fs.OpenMode.READ_ONLY);  
  const dstFd = fs.openSync(previewPath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);  
  
  // 使用sendfile避免内存拷贝  
  fs.copyFileSync(srcFd, dstFd);  
  fs.closeSync(srcFd);  
  fs.closeSync(dstFd);  
}  
// 文件操作监控
typescript

// 监听滤镜目录变化  
const watcher = fs.createWatcher(filterDir, 0);  
watcher.on('change', (event) => {  
  if (event.filename.endsWith('.json')) {  
    FilterEngine.reloadConfig();  
  }  
});  
// 加密文件兼容性
typescript

// 低版本系统降级处理  
if (!fs.setSecurity) {  
  // 使用鸿蒙3.0的加密方案  
  cryptoFramework.createCipher('AES256|CBC|PKCS7');  
}  
// 大文件分块处理
typescript

// 分块读取4K视频  
const chunkSize = 4 * 1024 * 1024;  
for (let offset = 0; offset < fileSize; offset += chunkSize) {  
  const buffer = fs.readSync(fd, {  
    offset,  
    length: Math.min(chunkSize, fileSize - offset)  
  });  
  VideoDecoder.feedData(buffer);  
}  

// 存储空间监控
typescript

// 注册存储状态监听  
fs.on('storageChange', (volId, state) => {  
  if (state === fs.StorageState.LOW_SPACE) {  
    autoCleanCache(); // 立即触发清理  
  }  
});  
posted @ 2025-06-17 17:15  yimapingchuan  阅读(12)  评论(0)    收藏  举报