1# 文件管理开发常见问题 2 3## 使用读写权限打开picker返回的uri失败(API 10) 4 5**问题现象** 6 7开发者调用picker接口保存文件返回uri,调用fs.openSync()接口打开该文件时传入了读写权限:fs.OpenMode.READ_WRITE,无法正常打开文件 8 9**原因分析** 10 11调用picker接口保存文件拿到的uri授权为只写,而开发者使用读写的方式打开uri,导致权限不允许,无法进行后续操作 12 13**解决措施** 14 15当前保存文件时,请使用只写方式打开文件uri: 16 17``` 18fs.openSync(uri, fs.OpenMode.WRITE_ONLY) 19``` 20 21后续文件选择器打开或保存文件时返回uri将授予读写权限,开发者根据需要进行文件打开与编辑。 22 23## 如何获取系统截屏图片的保存路径(API 9) 24 25**解决措施** 26 27截图图片保存路径:/storage/media/100/local/files/Pictures/Screenshots/ 28 29 30## 如何修改设备中文件目录为可读写权限(API 9) 31 32**问题现象** 33 34使用hdc命令向设备上发送文件时,报错:权限不足。 35 36**解决措施** 37 38输入命令 hdc shell mount -o remount,rw /,正确执行无提示信息。 39 40 41## 如何实现文件不存在则创建文件(API 9) 42 43**解决措施** 44 45可以通过调用函数fs.open来实现,open(path: string, mode?: number),指定第二个参数mode为fs.OpenMode.CREATE,表示若文件不存在,则创建文件。 46 47 48## 如何解决文件的中文乱码问题(API 9) 49 50**解决措施** 51 52读取文件内容的buffer数据后,通过\@ohos.util的TextDecoder对文件内容进行解码。 53 54``` 55let filePath = getContext(this).filesDir + "/test0.txt"; 56let stream = fs.createStreamSync(filePath, "r+"); 57let buffer = new ArrayBuffer(4096) 58let readOut = stream.readSync(buffer); 59let textDecoder = util.TextDecoder.create('utf-8', { ignoreBOM: true }) 60let readString = textDecoder.decodeWithStream(new Uint8Array(buffer), { stream: false }); 61console.log("读取的文件内容:" + readString); 62``` 63 64 65## “datashare://”路径使用fs.open可以打开,但使用fs.copyFile会报错(API 9) 66 67**解决措施** 68 69copyfile不支持uri,可以先使用open接口打开datashare uri后,拿到fd后再调用copyfile接口。 70 71``` 72let file = fs.openSync("datashare://...") 73fs.copyFile(file.fd, 'dstPath', 0).then(() => { 74 console.info('copyFile success') 75}).catch((err) => { 76 console.info("copy file failed with error message: " + err.message + ", error code: " + err.code); 77}) 78``` 79 80 81## 如何修改沙箱路径下json文件的指定内容(API 9) 82 83**解决措施** 84 85可以通过以下步骤来完成: 86 871. 使用fs.openSyn获取json文件的fd。 88 89 ``` 90 import fs from '@ohos.file.fs'; 91 let sanFile = fs.open(basePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 92 let fd = sanFile.fd; 93 ``` 94 952. 通过fs.readSync读取json文件内容。 96 97 ``` 98 let content = fs.readSync(basePath); 99 ``` 100 1013. 修改内容。 102 103 ``` 104 obj.name = 'new name'; 105 ``` 106 1074. 重新写入json文件。 108 109 ``` 110 fs.writeSync(file.fd, JSON.stringify(obj)); 111 ``` 112 113fs的具体使用可以参考:[@ohos.file.fs](../reference/apis-core-file-kit/js-apis-file-fs.md) 114 115## 通过fileAccess模块获取的文件路径对应的实际路径是什么(API 9) 116 117适用于Stage模型。 118 119**解决措施** 120 121此类文件是保存在/storage/media/100/local/files目录下,具体位置与文件类型和来源有关。知道文件名时,可在此目录下通过如下命令查找:find . -name [filename] 122 123**参考链接:** 124 125[应用文件上传下载](../basic-services/request/app-file-upload-download.md) 126 127## 如何监听文件或文件目录的变化(API 10) 128 129**解决措施** 130 131通过fs.createWatcher,可注册监听回调,从而监听文件或者目录的变化。 132 133**参考链接:** 134 135[@ohos.file.fs](../reference/apis-core-file-kit/js-apis-file-fs.md#fscreatewatcher10) 136