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

1 阅读1分钟

开发场景需求
在"拍摄美颜相机"应用中,用户照片、滤镜配置及缓存文件的高效管理直接影响应用性能。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(); // 立即触发清理

  }  

});`