Skip to content

Commit def88c5

Browse files
authored
fix:修复writeStream和writeFile目录不存在时未自动生成目录并报错问题 (#50)
1 parent e41eee7 commit def88c5

File tree

2 files changed

+48
-24
lines changed

2 files changed

+48
-24
lines changed

harmony/blobUtil/src/main/ets/ReactNativeBlobUtil/ReactNativeBlobUtilFS.ts

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import statvfs from "@ohos.file.statvfs"
99
import {filePreview} from "@kit.PreviewKit";
1010
import fileUri from "@ohos.file.fileuri";
1111

12+
const FILE_OR_DIR_NOT_EXIST: number = 13900002;
13+
1214
export default class ReactNativeBlobUtilFS {
1315

1416
private context: common.UIAbilityContext | undefined = undefined;
@@ -141,30 +143,40 @@ export default class ReactNativeBlobUtilFS {
141143
}
142144
}
143145

144-
145-
146-
writeFile(path: string,encoding: string,data: string ,transformFile: boolean, append: boolean):Promise<number> {
147-
return new Promise((resolve,reject) => {
146+
writeFile(path: string, encoding: string, data: string, transformFile: boolean, append: boolean): Promise<number> {
147+
return new Promise((resolve, reject) => {
148148
try {
149149
let accessRes = fs.accessSync(path);
150150
let file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
151151
if (append && accessRes) {
152152
file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.APPEND);
153153
}
154-
let writeLen = fs.writeSync(file.fd,data);
155-
if(writeLen==-1){
156-
console.log("write data to file succeed and size is:" + writeLen)
157-
}else{
158-
console.log('success')
154+
let writeLen = fs.writeSync(file.fd, data);
155+
if (writeLen === -1) {
156+
console.log("write data to file succeed and size is:" + writeLen);
157+
} else {
158+
console.log('success');
159159
}
160160
fs.closeSync(file);
161-
resolve(writeLen)
161+
resolve(writeLen);
162162
} catch (err) {
163-
let errMsg = "writeFile failed with error message: " + err.message + ", error code: " + err.code;
164-
console.error(errMsg);
165-
reject(errMsg);
163+
if (err.code === FILE_OR_DIR_NOT_EXIST) {
164+
try {
165+
fs.mkdirSync(path.substring(0, path.lastIndexOf('/')), true);
166+
this.writeFile(path, encoding, data, transformFile, append)
167+
.then(length => resolve(length))
168+
.catch(err => reject(err));
169+
} catch (e) {
170+
let errMsg = "writeFile failed with error message: " + err.message + ", error code: " + err.code;
171+
reject(errMsg);
172+
}
173+
} else {
174+
let errMsg = "writeFile failed with error message: " + err.message + ", error code: " + err.code;
175+
console.error(errMsg);
176+
reject(errMsg);
177+
}
166178
}
167-
})
179+
});
168180
}
169181

170182
writeFileArray(path:string,data:Array<any>,append:boolean):Promise<number> {

harmony/blobUtil/src/main/ets/ReactNativeBlobUtil/ReactNativeBlobUtilStream.ts

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ import { buffer } from '@kit.ArkTS';
77

88
export type BlobUtilViewDescriptor = Descriptor<"RNCBlobUtil">
99
export const FAST_BLOB_UTIL = "BlobUtil"
10+
const FILE_OR_DIR_NOT_EXIST: number = 13900002;
1011

1112
export type Encoding = "utf8" | "ascii" | "base64";
1213
export type Stream = {encoding:string,stream:fs.Stream | undefined}
14+
1315
export interface ReactNativeBlobUtilReadStream {
1416
path: string;
1517
encoding: Encoding;
@@ -38,25 +40,35 @@ export default class ReactNativeBlobUtilStream {
3840
}
3941

4042

41-
async writeStream(filePath: string, encoding: string, append: boolean, callback: (errCode, errMsg, streamId?: string) => void) {
42-
if (!fs.accessSync(filePath)) {
43-
callback("ENOENT", "File '" + filePath + "' does not exist and could not be created");
44-
return
43+
async writeStream(filePath: string, encoding: string, append: boolean,
44+
callback: (errCode, errMsg, streamId?: string) => void) {
45+
let accessRes = fs.accessSync(filePath);
46+
let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
47+
if (append && accessRes) {
48+
file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.APPEND);
4549
}
46-
let file = fs.openSync(filePath);
4750
this.encoding = encoding;
4851
try {
49-
let stream = await fs.createStreamSync(filePath, "a+")
52+
let stream = await fs.createStreamSync(filePath, "a+");
5053
let uuid = util.generateRandomUUID(true);
5154
ReactNativeBlobUtilStream.fileStreams.set(uuid, {
5255
stream: stream,
5356
encoding: encoding
54-
})
55-
this.stream = stream
57+
});
58+
this.stream = stream;
5659
fs.closeSync(file);
57-
callback(null, null, uuid)
60+
callback(null, null, uuid);
5861
} catch (err) {
59-
callback("EUNSPECIFIED", "Failed to create write stream at path `" + filePath + "`; " + err.message);
62+
if (err.code === FILE_OR_DIR_NOT_EXIST) {
63+
try {
64+
fs.mkdirSync(filePath.substring(0, filePath.lastIndexOf('/')), true);
65+
await this.writeStream(filePath, encoding, append, callback);
66+
} catch (e) {
67+
callback("EUNSPECIFIED", "Failed to create write stream at path `" + filePath + "`; " + err.code);
68+
}
69+
} else {
70+
callback("EUNSPECIFIED", "Failed to create write stream at path `" + filePath + "`; " + err.code);
71+
}
6072
}
6173
}
6274

0 commit comments

Comments
 (0)