From 6564aa991141cca590b9d8c72d4959e9a8094879 Mon Sep 17 00:00:00 2001 From: gaohui Date: Wed, 24 Nov 2021 14:13:31 +0800 Subject: [PATCH 1/3] add new sample etsfileio Signed-off-by: gaohui --- data/EtsFileIo/README_zh.md | 21 +++ data/EtsFileIo/build.gradle | 34 +++++ data/EtsFileIo/entry/build.gradle | 21 +++ data/EtsFileIo/entry/src/main/config.json | 66 ++++++++ .../entry/src/main/ets/MainAbility/app.ets | 23 +++ .../src/main/ets/MainAbility/pages/index.ets | 142 ++++++++++++++++++ .../main/resources/base/element/string.json | 36 +++++ .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../screenshots/device/etsFileIo.png | Bin 0 -> 32373 bytes data/EtsFileIo/settings.gradle | 1 + 10 files changed, 344 insertions(+) create mode 100644 data/EtsFileIo/README_zh.md create mode 100644 data/EtsFileIo/build.gradle create mode 100644 data/EtsFileIo/entry/build.gradle create mode 100644 data/EtsFileIo/entry/src/main/config.json create mode 100644 data/EtsFileIo/entry/src/main/ets/MainAbility/app.ets create mode 100644 data/EtsFileIo/entry/src/main/ets/MainAbility/pages/index.ets create mode 100644 data/EtsFileIo/entry/src/main/resources/base/element/string.json create mode 100644 data/EtsFileIo/entry/src/main/resources/base/media/icon.png create mode 100644 data/EtsFileIo/screenshots/device/etsFileIo.png create mode 100644 data/EtsFileIo/settings.gradle diff --git a/data/EtsFileIo/README_zh.md b/data/EtsFileIo/README_zh.md new file mode 100644 index 0000000000..0099ed8851 --- /dev/null +++ b/data/EtsFileIo/README_zh.md @@ -0,0 +1,21 @@ +# 文档管理 + +### 简介 + +本示例展示了文档管理的部分功能,例如:创建文件、修改文件名、文件写入、文件读取、删除文件。 + +### 使用说明 + +1.点击"Create fileio"按钮,创建文件,创建成功,Toast显示文件的绝对路径; + +2.点击"Rename fileio"按钮,修改文件名,修改成功,Toast显示修改文件名后的绝对路径; + +3.点击"Write fileio"按钮,向文件中写入内容,写入成功,Toast显示文件写入的内容; + +4.点击"Read fileio"按钮,读取文件中的内容,读取成功,文本框中显示读取到的内容; + +5.点击"Delete fileio"按钮,删除文件,Toast显示文件删除成功。 + +### 约束与限制 + +本示例仅支持在标准系统上运行。 \ No newline at end of file diff --git a/data/EtsFileIo/build.gradle b/data/EtsFileIo/build.gradle new file mode 100644 index 0000000000..c2c8bbaed1 --- /dev/null +++ b/data/EtsFileIo/build.gradle @@ -0,0 +1,34 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +apply plugin: 'com.huawei.ohos.app' + +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion 7 + supportSystem "standard" +} + +buildscript { + repositories { + maven { + url 'https://repo.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + } + dependencies { + classpath 'com.huawei.ohos:hap:3.0.3.4' + classpath 'com.huawei.ohos:decctest:1.2.6.0' + } +} + +allprojects { + repositories { + maven { + url 'https://repo.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + } +} diff --git a/data/EtsFileIo/entry/build.gradle b/data/EtsFileIo/entry/build.gradle new file mode 100644 index 0000000000..1587dd1948 --- /dev/null +++ b/data/EtsFileIo/entry/build.gradle @@ -0,0 +1,21 @@ +apply plugin: 'com.huawei.ohos.hap' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion 7 + defaultConfig { + compatibleSdkVersion 7 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) + testImplementation 'junit:junit:4.13.1' +} diff --git a/data/EtsFileIo/entry/src/main/config.json b/data/EtsFileIo/entry/src/main/config.json new file mode 100644 index 0000000000..8a0252f68d --- /dev/null +++ b/data/EtsFileIo/entry/src/main/config.json @@ -0,0 +1,66 @@ +{ + "app": { + "bundleName": "ohos.samples.etsfileio", + "vendor": "samples", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "ohos.samples.etsfileio", + "name": ".MyApplication", + "mainAbility": ".MainAbility", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry", + "installationFree": false + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "orientation": "unspecified", + "visible": true, + "srcPath": "MainAbility", + "name": ".MainAbility", + "srcLanguage": "ets", + "icon": "$media:icon", + "description": "$string:description_mainability", + "formsEnabled": false, + "label": "$string:app_name", + "type": "page", + "launchType": "standard" + } + ], + "js": [ + { + "mode": { + "syntax": "ets", + "type": "pageAbility" + }, + "pages": [ + "pages/index" + ], + "name": ".MainAbility", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } +} \ No newline at end of file diff --git a/data/EtsFileIo/entry/src/main/ets/MainAbility/app.ets b/data/EtsFileIo/entry/src/main/ets/MainAbility/app.ets new file mode 100644 index 0000000000..bf28e58b36 --- /dev/null +++ b/data/EtsFileIo/entry/src/main/ets/MainAbility/app.ets @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export default { + onCreate() { + console.info('Application onCreate') + }, + onDestroy() { + console.info('Application onDestroy') + }, +} \ No newline at end of file diff --git a/data/EtsFileIo/entry/src/main/ets/MainAbility/pages/index.ets b/data/EtsFileIo/entry/src/main/ets/MainAbility/pages/index.ets new file mode 100644 index 0000000000..a2ea400ab0 --- /dev/null +++ b/data/EtsFileIo/entry/src/main/ets/MainAbility/pages/index.ets @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import fileio from '@ohos.fileio' +import featureAbility from '@ohos.ability.featureAbility' +import prompt from '@system.prompt' + +const writeContent = 'hello, fileio' +var context = featureAbility.getContext() +var path +var stream +context.getOrCreateLocalDir().then((e) => { + path = e + '/files' + console.log('EtsFileIo =' + path) +}) + +@Entry +@Component +struct Index { + @State result: string = '' + @State newPath: string = '' + @State readText: string = '' + @State fd: number = 0 + private options: Resource [] = [$r('app.string.create_fileio'), $r('app.string.rename_fileio'), + $r('app.string.write_fileio'), $r('app.string.read_fileio'), $r('app.string.delete_fileio')] + + create_fileio() { + this.result = path + '/xxx.txt' + this.fd = fileio.openSync(this.result, 0o2 | 0o100, 0o666) + prompt.showToast({ message: 'create_file success =>' + this.result, duration: 2000 }) + console.log('EtsFileIo fd =' + this.fd) + } + + rename_fileio() { + this.newPath = path + '/EtsFileIo.txt' + fileio.renameSync(this.result, this.newPath) + prompt.showToast({ message: 'rename_file success =>' + this.newPath, duration: 2000 }) + } + + write_fileio() { + stream = fileio.createStreamSync(this.newPath, "r+") + let writelength = stream.writeSync(writeContent, { + offset: 0, + length: writeContent.length, + position: 0, + encoding: 'utf-8' + }) + prompt.showToast({ message: 'write_fileio success =>' + 'hello, fileio', duration: 2000 }) + console.log('EtsFileIo WriteLength = ' + writelength) + } + + read_fileio() { + let fdio = fileio.openSync(this.newPath, 0o2) + console.log('EtsFileIo fdio = ' + fdio) + let buf = new ArrayBuffer(4096) + let length = stream.readSync(buf, { offset: 0, length: writeContent.length, position: 0 }) + this.readText = String.fromCharCode.apply(null, new Uint8Array(buf)) + prompt.showToast({ message: 'read_filelo success', duration: 2000 }) + console.log('EtsFileIo buf = ' + this.readText) + console.log('EtsFileIo length = ' + length) + } + + delete_fileio() { + fileio.unlinkSync(this.newPath) + prompt.showToast({ message: 'delete_file success', duration: 2000 }) + } + + build() { + Column() { + Text($r("app.string.title")) + .width('100%') + .height(50) + .backgroundColor('#0D9FFB') + .fontColor(Color.White) + .fontSize(20) + .padding({ left: 15 }) + Scroll() { + Column() { + ForEach(this.options, item => { + Button() { + Text(item) + .fontSize(19) + .fontWeight(FontWeight.Bold) + .padding({ left: 10, right: 10 }) + .width('100%') + .textAlign(TextAlign.Center) + }.type(ButtonType.Capsule) + .backgroundColor('#0D9FFB') + .margin({ top: 15 }) + .onClick(() => { + var index = this.options.indexOf(item) + switch (index) { + case 0: + this.create_fileio() + break + case 1: + this.rename_fileio() + break + case 2: + this.write_fileio() + break + case 3: + this.read_fileio() + break + case 4: + this.delete_fileio() + break + default: + prompt.showToast({ message: 'error', duration: 2000 }) + break + } + }) + }, item => JSON.stringify(item)) + + Text(this.readText) + .width('100%') + .height(200) + .backgroundColor('#DFDFDF') + .fontSize(20) + .margin({ top: 20 }) + .textAlign(TextAlign.Start) + .padding(10) + } + .constraintSize({ minHeight: '100%' }) + } + .width('100%').height('100%') + .padding(15) + } + } +} \ No newline at end of file diff --git a/data/EtsFileIo/entry/src/main/resources/base/element/string.json b/data/EtsFileIo/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000000..38493adf16 --- /dev/null +++ b/data/EtsFileIo/entry/src/main/resources/base/element/string.json @@ -0,0 +1,36 @@ +{ + "string": [ + { + "name": "app_name", + "value": "eTSFileIO" + }, + { + "name": "description_mainability", + "value": "ETS_Empty Ability" + }, + { + "name": "title", + "value": "eTSFileIO" + }, + { + "name": "create_fileio", + "value": "Create fileio" + }, + { + "name": "rename_fileio", + "value": "Rename fileio" + }, + { + "name": "write_fileio", + "value": "Write fileio" + }, + { + "name": "delete_fileio", + "value": "Delete fileio" + }, + { + "name": "read_fileio", + "value": "Read fileio" + } + ] +} \ No newline at end of file diff --git a/data/EtsFileIo/entry/src/main/resources/base/media/icon.png b/data/EtsFileIo/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 Date: Thu, 25 Nov 2021 16:55:26 +0800 Subject: [PATCH 2/3] internationalization Signed-off-by: gaohui --- .../src/main/ets/MainAbility/pages/index.ets | 2 +- .../src/main/resources/en/element/string.json | 36 +++++++++++++++++++ .../src/main/resources/zh/element/string.json | 36 +++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 data/EtsFileIo/entry/src/main/resources/en/element/string.json create mode 100644 data/EtsFileIo/entry/src/main/resources/zh/element/string.json diff --git a/data/EtsFileIo/entry/src/main/ets/MainAbility/pages/index.ets b/data/EtsFileIo/entry/src/main/ets/MainAbility/pages/index.ets index a2ea400ab0..83777da02e 100644 --- a/data/EtsFileIo/entry/src/main/ets/MainAbility/pages/index.ets +++ b/data/EtsFileIo/entry/src/main/ets/MainAbility/pages/index.ets @@ -19,7 +19,7 @@ import prompt from '@system.prompt' const writeContent = 'hello, fileio' var context = featureAbility.getContext() -var path +var path = '' var stream context.getOrCreateLocalDir().then((e) => { path = e + '/files' diff --git a/data/EtsFileIo/entry/src/main/resources/en/element/string.json b/data/EtsFileIo/entry/src/main/resources/en/element/string.json new file mode 100644 index 0000000000..38493adf16 --- /dev/null +++ b/data/EtsFileIo/entry/src/main/resources/en/element/string.json @@ -0,0 +1,36 @@ +{ + "string": [ + { + "name": "app_name", + "value": "eTSFileIO" + }, + { + "name": "description_mainability", + "value": "ETS_Empty Ability" + }, + { + "name": "title", + "value": "eTSFileIO" + }, + { + "name": "create_fileio", + "value": "Create fileio" + }, + { + "name": "rename_fileio", + "value": "Rename fileio" + }, + { + "name": "write_fileio", + "value": "Write fileio" + }, + { + "name": "delete_fileio", + "value": "Delete fileio" + }, + { + "name": "read_fileio", + "value": "Read fileio" + } + ] +} \ No newline at end of file diff --git a/data/EtsFileIo/entry/src/main/resources/zh/element/string.json b/data/EtsFileIo/entry/src/main/resources/zh/element/string.json new file mode 100644 index 0000000000..36a3f6219b --- /dev/null +++ b/data/EtsFileIo/entry/src/main/resources/zh/element/string.json @@ -0,0 +1,36 @@ +{ + "string": [ + { + "name": "app_name", + "value": "文件管理" + }, + { + "name": "description_mainability", + "value": "ETS_Empty Ability" + }, + { + "name": "title", + "value": "文件管理" + }, + { + "name": "create_fileio", + "value": "创建文件" + }, + { + "name": "rename_fileio", + "value": "修改文件名" + }, + { + "name": "write_fileio", + "value": "文件写入" + }, + { + "name": "delete_fileio", + "value": "删除文件" + }, + { + "name": "read_fileio", + "value": "读取文件" + } + ] +} \ No newline at end of file -- Gitee From fb3db290465d957fa8c01f4c87359785ccb3347d Mon Sep 17 00:00:00 2001 From: gaohui Date: Mon, 29 Nov 2021 11:17:54 +0800 Subject: [PATCH 3/3] update project name Signed-off-by: gaohui --- .../src/main/ets/MainAbility/pages/index.ets | 78 +++++++++++++++---- .../main/resources/base/element/string.json | 20 +++++ .../src/main/resources/en/element/string.json | 30 +++++-- .../src/main/resources/zh/element/string.json | 20 +++++ 4 files changed, 127 insertions(+), 21 deletions(-) diff --git a/data/EtsFileIo/entry/src/main/ets/MainAbility/pages/index.ets b/data/EtsFileIo/entry/src/main/ets/MainAbility/pages/index.ets index 83777da02e..c43ef41e68 100644 --- a/data/EtsFileIo/entry/src/main/ets/MainAbility/pages/index.ets +++ b/data/EtsFileIo/entry/src/main/ets/MainAbility/pages/index.ets @@ -16,6 +16,7 @@ import fileio from '@ohos.fileio' import featureAbility from '@ohos.ability.featureAbility' import prompt from '@system.prompt' +import resourceManager from '@ohos.resourceManager' const writeContent = 'hello, fileio' var context = featureAbility.getContext() @@ -32,24 +33,69 @@ struct Index { @State result: string = '' @State newPath: string = '' @State readText: string = '' + @State createStr: string = '' + @State renameStr: string = '' + @State writeStr: string = '' + @State readStr: string = '' + @State deleteStr: string = '' @State fd: number = 0 private options: Resource [] = [$r('app.string.create_fileio'), $r('app.string.rename_fileio'), $r('app.string.write_fileio'), $r('app.string.read_fileio'), $r('app.string.delete_fileio')] - create_fileio() { - this.result = path + '/xxx.txt' + aboutToAppear(){ + resourceManager.getResourceManager().then(mgr =>{ + mgr.getString(0x1000002,(error, value) =>{ + console.log('ResourceManager:getString createStr error = ' + error + ',value = ' + value) + if(error != null){ + return + } + this.createStr = value + }) + mgr.getString(0x1000009,(error, value) =>{ + console.log('ResourceManager:getString renameStr error = ' + error + ',value = ' + value) + if(error != null){ + return + } + this.renameStr = value + }) + mgr.getString(0x100000c,(error, value) =>{ + console.log('ResourceManager:getString writeStr error = ' + error + ',value = ' + value) + if(error != null){ + return + } + this.writeStr = value + }) + mgr.getString(0x1000007,(error, value) =>{ + console.log('ResourceManager:getString readStr error = ' + error + ',value = ' + value) + if(error != null){ + return + } + this.readStr = value + }) + mgr.getString(0x1000004,(error, value) =>{ + console.log('ResourceManager:getString deleteStr error = ' + error + ',value = ' + value) + if(error != null){ + return + } + this.deleteStr = value + }) + }) + } + + createFileIo() { + this.result = path + '/test.txt' this.fd = fileio.openSync(this.result, 0o2 | 0o100, 0o666) - prompt.showToast({ message: 'create_file success =>' + this.result, duration: 2000 }) + prompt.showToast({ message: this.createStr + this.result, duration: 2000 }) console.log('EtsFileIo fd =' + this.fd) } - rename_fileio() { + renameFileIo() { this.newPath = path + '/EtsFileIo.txt' fileio.renameSync(this.result, this.newPath) - prompt.showToast({ message: 'rename_file success =>' + this.newPath, duration: 2000 }) + prompt.showToast({ message: this.renameStr + this.newPath, duration: 2000 }) } - write_fileio() { + writeFileIo() { stream = fileio.createStreamSync(this.newPath, "r+") let writelength = stream.writeSync(writeContent, { offset: 0, @@ -57,24 +103,24 @@ struct Index { position: 0, encoding: 'utf-8' }) - prompt.showToast({ message: 'write_fileio success =>' + 'hello, fileio', duration: 2000 }) + prompt.showToast({ message: this.writeStr + writeContent, duration: 2000 }) console.log('EtsFileIo WriteLength = ' + writelength) } - read_fileio() { + readFileIo() { let fdio = fileio.openSync(this.newPath, 0o2) console.log('EtsFileIo fdio = ' + fdio) let buf = new ArrayBuffer(4096) let length = stream.readSync(buf, { offset: 0, length: writeContent.length, position: 0 }) this.readText = String.fromCharCode.apply(null, new Uint8Array(buf)) - prompt.showToast({ message: 'read_filelo success', duration: 2000 }) + prompt.showToast({ message: this.readStr, duration: 2000 }) console.log('EtsFileIo buf = ' + this.readText) console.log('EtsFileIo length = ' + length) } - delete_fileio() { + deleteFileIo() { fileio.unlinkSync(this.newPath) - prompt.showToast({ message: 'delete_file success', duration: 2000 }) + prompt.showToast({ message: this.deleteStr, duration: 2000 }) } build() { @@ -103,19 +149,19 @@ struct Index { var index = this.options.indexOf(item) switch (index) { case 0: - this.create_fileio() + this.createFileIo() break case 1: - this.rename_fileio() + this.renameFileIo() break case 2: - this.write_fileio() + this.writeFileIo() break case 3: - this.read_fileio() + this.readFileIo() break case 4: - this.delete_fileio() + this.deleteFileIo() break default: prompt.showToast({ message: 'error', duration: 2000 }) diff --git a/data/EtsFileIo/entry/src/main/resources/base/element/string.json b/data/EtsFileIo/entry/src/main/resources/base/element/string.json index 38493adf16..8831d0490d 100644 --- a/data/EtsFileIo/entry/src/main/resources/base/element/string.json +++ b/data/EtsFileIo/entry/src/main/resources/base/element/string.json @@ -31,6 +31,26 @@ { "name": "read_fileio", "value": "Read fileio" + }, + { + "name": "create_string", + "value": "create_file success =>" + }, + { + "name": "rename_string", + "value": "rename_file success =>" + }, + { + "name": "write_string", + "value": "write_file success =>" + }, + { + "name": "read_string", + "value": "read_file success" + }, + { + "name": "delete_string", + "value": "delete_file success" } ] } \ No newline at end of file diff --git a/data/EtsFileIo/entry/src/main/resources/en/element/string.json b/data/EtsFileIo/entry/src/main/resources/en/element/string.json index 38493adf16..2d13486730 100644 --- a/data/EtsFileIo/entry/src/main/resources/en/element/string.json +++ b/data/EtsFileIo/entry/src/main/resources/en/element/string.json @@ -14,23 +14,43 @@ }, { "name": "create_fileio", - "value": "Create fileio" + "value": "Create file" }, { "name": "rename_fileio", - "value": "Rename fileio" + "value": "Rename file" }, { "name": "write_fileio", - "value": "Write fileio" + "value": "Write file" }, { "name": "delete_fileio", - "value": "Delete fileio" + "value": "Delete file" }, { "name": "read_fileio", - "value": "Read fileio" + "value": "Read file" + }, + { + "name": "create_string", + "value": "create_file success =>" + }, + { + "name": "rename_string", + "value": "rename_file success =>" + }, + { + "name": "write_string", + "value": "write_file success =>" + }, + { + "name": "read_string", + "value": "read_file success" + }, + { + "name": "delete_string", + "value": "delete_file success" } ] } \ No newline at end of file diff --git a/data/EtsFileIo/entry/src/main/resources/zh/element/string.json b/data/EtsFileIo/entry/src/main/resources/zh/element/string.json index 36a3f6219b..c810691760 100644 --- a/data/EtsFileIo/entry/src/main/resources/zh/element/string.json +++ b/data/EtsFileIo/entry/src/main/resources/zh/element/string.json @@ -31,6 +31,26 @@ { "name": "read_fileio", "value": "读取文件" + }, + { + "name": "create_string", + "value": "创建文件成功 =>" + }, + { + "name": "rename_string", + "value": "修改文件名成功 =>" + }, + { + "name": "write_string", + "value": "写入文件成功 =>" + }, + { + "name": "read_string", + "value": "读取文件成功" + }, + { + "name": "delete_string", + "value": "删除文件成功" } ] } \ No newline at end of file -- Gitee