HarmonyOS鸿蒙Next中克隆成功后文件夹和文件中文名称出现乱码如何解决

HarmonyOS鸿蒙Next中克隆成功后文件夹和文件中文名称出现乱码如何解决

async migrateAnnotation(srcPath: string, destPath: string): Promise<void> {

  console.log("LYH:" + srcPath + ' ' + destPath);

  // 判断目录是否存在
  if (!fileIo.accessSync(srcPath)) {
    console.log('弹出了')
    return;
  }

  try {
    // 创建目标根目录
    if (!fileIo.accessSync(destPath)) {
      fileIo.mkdirSync(destPath);
    }

    let srcDirPathLocal: string = srcPath
    let dstDirPathLocal: string = destPath

    let srcDirUriLocal: string = fileUri.getUriFromPath(srcDirPathLocal);
    let dstDirUriLocal: string = fileUri.getUriFromPath(dstDirPathLocal);

    let progressListener: fs.ProgressListener = (progress: fs.Progress) => {
      console.info(`progressSize: ${progress.processedSize}, totalSize: ${progress.totalSize}`);
    };
    let copyoption: fs.CopyOptions = {
      "progressListener": progressListener
    }
    try {
      fs.copy(srcDirUriLocal, dstDirUriLocal, copyoption).then(() => {
        console.info("Succeeded in copying. ");
      }).catch((err: BusinessError) => {
        console.error(`Failed to copy: ${JSON.stringify(err)}`);
      })
    } catch (err) {
      console.error(`Failed to copy: ${JSON.stringify(err)}`);
    }
    fs.copyFileSync(srcPath, destPath);

  } catch (err) {
    console.error(`Copy failed: ${err.code} - ${err.message}`);
  }
}

在entryBackupAbility文件中迁移数据成功后文件夹中文名称出现乱码


更多关于HarmonyOS鸿蒙Next中克隆成功后文件夹和文件中文名称出现乱码如何解决的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

开发者您好,这边使用的压缩文件是utf-8格式吗?

如果不是的话麻烦改成utf-8压缩在试下迁移后会不会出现乱码,如果是utf-8的格式麻烦看下能否提供下压缩文件。

更多关于HarmonyOS鸿蒙Next中克隆成功后文件夹和文件中文名称出现乱码如何解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


大佬有解决吗?我做数据备份导入时也出现了文件目录乱码的问题了

getUriFromPath(path: string): string

通过传入的路径path生成应用自己的URI;将path转URI时,路径中的中文及非数字字母的特殊字符将会被编译成对应的ASCII码,拼接在URI中。

所以转为uri后,中文都变为了对应的ASCII码。

你可以将copy()方法替换为 copyFile() 方法,这个方法支持直接使用srcPath,不需要再转为uri.

import { BusinessError } from '@kit.BasicServicesKit';
let srcPath = pathDir + "/srcDir/test.txt";
let dstPath = pathDir + "/dstDir/test.txt";
fs.copyFile(srcPath, dstPath, 0).then(() => {
  console.info("copy file succeed");
}).catch((err: BusinessError) => {
  console.error("copy file failed with error message: " + err.message + ", error code: " + err.code);
});
async migrateAnnotation(srcPath: string, destPath: string): Promise<void> {
  console.log("Migration paths:", srcPath, destPath);

  // 检查源目录是否存在
  if (!fileIo.accessSync(srcPath)) {
    console.error('Source directory not found');
    return;
  }

  try {
    // 递归创建目标目录
    if (!fileIo.accessSync(destPath)) {
      fs.mkdir(destPath, { recursive: true });
    }

    const srcUri = fileUri.getUriFromPath(srcPath, "utf-8");
    const destUri = fileUri.getUriFromPath(destPath, "utf-8");

    const progressListener: fs.ProgressListener = (progress) => {
      console.info(`Progress: ${progress.processedSize}/${progress.totalSize}`);
    };

    await fs.copy(srcUri, destUri, { progressListener });
    console.info("Copy completed successfully");

  } catch (err) {
    console.error(`Copy failed: ${err.code} - ${err.message}`);
  }
}

中文名称乱码问题通常由文件路径编码不一致或文件系统处理不当导致。以下是针对代码的解决方案和优化建议:

核心问题定位

  1. 编码问题:文件路径包含中文时,若未统一指定编码格式(如UTF-8),可能导致乱码。
  2. 冗余操作:代码同时使用了异步 fs.copy() 和同步 fs.copyFileSync(),后者可能覆盖前者的操作并引发冲突。
  3. 目录创建逻辑缺陷:accessSync 检查目录存在性后,未处理目录已存在但无权限的情况。

fileUri.getUriFromPath()只有一个参数,

在HarmonyOS Next中,克隆后中文文件名乱码通常由编码不一致导致。请检查文件系统编码是否为UTF-8,并确保开发环境与项目编码统一。可在IDE中调整编码设置,或通过命令行工具转换文件编码格式。

这是一个典型的文件系统编码问题。在HarmonyOS Next中,fs.copy() 方法在处理中文路径时可能出现编码不一致。

解决方案:

  1. 检查源路径编码:确保源路径中的中文字符使用UTF-8编码。在调用 fs.copy() 前,可以尝试对路径进行编码处理:
import { util } from '@kit.ArkTS';

let srcDirUriLocal: string = fileUri.getUriFromPath(srcDirPathLocal);
let dstDirUriLocal: string = fileUri.getUriFromPath(dstDirPathLocal);

// 添加编码转换
srcDirUriLocal = util.encodeURIComponent(srcDirUriLocal);
dstDirUriLocal = util.encodeURIComponent(dstDirUriLocal);
  1. 使用正确的URI构造方式:确保使用 fileUri.getUriFromPath() 时路径格式正确:
// 确保路径以正确的格式传递
let srcDirUriLocal: string = fileUri.getUriFromPath(encodeURI(srcDirPathLocal));
let dstDirUriLocal: string = fileUri.getUriFromPath(encodeURI(dstDirPathLocal));
  1. 检查文件系统API版本:确认使用的 @ohos.file.fs API是最新版本,早期版本可能存在编码问题。

  2. 代码问题:你的代码中在异步 fs.copy() 调用后还同步调用了 fs.copyFileSync(),这可能导致冲突。移除重复的复制操作:

// 删除这行多余的同步复制
// fs.copyFileSync(srcPath, destPath);
  1. 验证方法:在复制前添加日志验证路径编码:
console.info("Source URI: " + srcDirUriLocal);
console.info("Dest URI: " + dstDirUriLocal);

主要问题很可能是URI编码不一致导致的。HarmonyOS Next的文件系统API在处理中文路径时需要确保正确的URI编码格式。

回到顶部