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