成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenHarmony 文件監聽開發樣例介紹

系統 OpenHarmony
監聽機制是一種常見的計算機安全技術,它可以監控計算機系統中的各種活動,以便及時發現和處理安全問題。文件監聽具有重要的現實意義,對文件進行監聽,企業可以及時發現員工不當處理敏感信息和意外泄漏信息的情況,采取行動避免數據泄露。

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

OpenHarmony是由開放原子開源基金會(OpenAtom Foundation)孵化及運營的開源項目,目標是面向全場景、全連接、全智能時代,基于開源的方式,搭建一個智能終端設備操作系統的框架和平臺,促進萬物互聯產業的繁榮發展。

監聽機制是一種常見的計算機安全技術,它可以監控計算機系統中的各種活動,以便及時發現和處理安全問題。文件監聽具有重要的現實意義,對文件進行監聽,企業可以及時發現員工不當處理敏感信息和意外泄漏信息的情況,采取行動避免數據泄露。

本文以文件管理FileManager為例,介紹文件監聽的應用實現以此了解@ohos.file.fs模塊中涉及的接口的使用方法。

一、開發環境準備

下載并安裝DevEco Studio,建議使用DevEco Studio 3.1 Release (Build Version: 3.1.0.500, built on April 28, 2023)及以上版本:

  • DevEco Studio下載鏈接
  • 下載sample倉庫源碼:
  • sample倉源碼路徑

下載源碼之后將FileManager工程導入DevEco Studio,首先對工程進行自動化簽名,然后進行編譯構建生成HAP應用安裝包,安裝應用示例之前,請先查看"README_zh.md"文件來確認應用示例是否為stage模型,若為Stage模型需要查看entry/src/main路徑下的module.json5文件中的"deviceType"字段來確認該應用支持的設備類型;否則為FA模型,查看entry/src/main路徑下的config.json文件中的"deviceType"字段來確認該應用示例支持的設備類型,兩種模型都可嘗試通過修改該字段使其可以在相應類型的設備上運行。文件管理FileManager為stage模型,支持設備為rk3568。安裝運行之后,即可在設備上查看應用示例運行效果,以及進行相關調試。

二、實現

文件管理新增功能為文件監聽,使用@ohos.file.fs模塊watcher接口對文件、文件夾進行監控,添加相應監聽后對文件進行增加、刪除、修改操作后日志信息顯示出相應監聽日志,停止相應監聽后對文件進行增加、刪除、修改操作后日志信息無變化。

在使用接口時需要查看并配置接口對應的權限,監聽文件時使用了系統接口,需要配置系統應用簽名,可以參考特殊權限配置方法 ,把配置文件中的“app-feature”字段信息改為“hos_system_app”,再將“apl”字段信息改為“system_core”。另外,監聽文件使用了API10接口,因此本工程僅支持API10版本的SDK。

1、流程圖

OpenHarmony 文件監聽開發樣例介紹-開源基礎軟件社區OpenHarmony 文件監聽開發樣例介紹-開源基礎軟件社區

2、實現過程

(1)增加監聽

使用數組watcherEvent保存監聽變動的事件集,使用組件TextPickerDialog選擇監聽變動事件集,當用戶選擇一個監聽事件添加監聽時,調用startWatcher()方法進行監聽,并將其保存到已添加監聽事件WatcherList數組中。

src/main/ets/pages/WatcherFile.ets:

TextPickerDialog.show({
   range: this.watcherEvent,
   selected: this.select,
   onAccept: (value: TextPickerResult) => {
     this.select = Number(value.index);
     this.eachEvent = this.watcherEvent[this.select];
     this.myWatcher.startWatcher(this.eachEvent);
     this.eventArray.push(this.eachEvent); // 新增列表項數據
   }
})

在startWatcher()方法中,根據需要添加的監聽事件使用fs.createWatcher()創建Watcher對象,用來監聽文件或目錄變動,調用watcher.start()開啟監聽,當監聽事件發生一次,回調將會獲取監聽事件相關日志。

src/main/ets/filemanager/fileFs/MyWatcher.ts:

startWatcher(watcherName: string): void {
    let watcherDir: string = this.baseDir + '/watcherDir';
    Logger.info(TAG, `${watcherName}-startWatcher start path = ${watcherDir}`);
    if (this.watcherCodeMap.has(watcherName)) { // 是否存在key 'watchName': true
      try {
        Logger.info(TAG, `${watcherName}-startWatcher has watchName`);
        let watcher: fs.Watcher = fs.createWatcher(watcherDir, this.watcherCodeMap.get(watcherName), (data) => { //獲取key對應的value
          AppStorage.SetOrCreate('eventLog', JSON.stringify(data.event));
          AppStorage.SetOrCreate('fileNameLog', data.fileName);
          AppStorage.SetOrCreate('cookieLog', JSON.stringify(data.cookie));
          Logger.info(TAG, `${watcherName}-startWatcher :{event: ${data.event}, fileName: ${data.fileName}, cookie: ${data.cookie}}`);
        });
        watcher.start();
        setTimeout(async () => {
          this.watcherList.push(watcher);
        }, this.timeOut);

        Logger.info('watcherList is ' + JSON.stringify(this.watcherList));
      } catch (e) {
        Logger.error(TAG, `${watcherName}-startWatcher has failed for: {message: ${e.message}, code: ${e.code}}`);
      }
    } else {
      Logger.info(TAG, `${watcherName}-startWatcher does not in watcherCodeMap`);
    }
  }

(2)停止監聽

當用戶選擇一個監聽停止監聽時,調用stopWatcher()方法停止監聽,并將已添加監聽事件WatcherList數組中該監聽事件移除。

src/main/ets/pages/WatcherFile.ets:

TextPickerDialog.show({
   range: showEventArray,
   selected: this.selectDel,
   onAccept: (value: TextPickerResult) => {
     this.selectDel = Number(value.index);
     this.myWatcher.stopWatcher(this.myWatcher.watcherList[this.selectDel], this.selectDel);
     this.eventArray.splice(this.selectDel, 1);  // 刪除列表項數據
     showEventArray.splice(this.selectDel, 1); 
   }
 })

在stopWatcher()方法中,調用watcher.stop()停止監聽,當停止監聽的事件發生時,不再產生監聽日志。

src/main/ets/filemanager/fileFs/MyWatcher.ts:

stopWatcher(watcher: fs.Watcher, index: number): void {
    if (watcher !== null) {
      watcher.stop();
      setTimeout(async () => {
        this.watcherList.splice(index, 1);
      }, this.timeOut);
      Logger.info(TAG, 'stopWatcher successful');
    } else {
      Logger.info(TAG, 'stopWatcher null');
    }
  }

(3)增加文件

當對應用沙箱文件或文件夾添加IN_CREATE監聽后,在沙箱文件路徑下新增一個文件,應用內則會打印出相應監聽日志,使用fs.openSync打開文件,fs.writeSync方法對文件進行寫入內容,fs.closeSync關閉文件。在沙箱路徑下增加一個文件的具體實現方法如下所示:

src/main/ets/filemanager/fileFs/MyWatcher.ts:

addFileToWatcher(path: string): void {
    let content = CONTENT + '\n';
    try {
      let addFile = this.baseDir + '/watcherDir/' + path;
      Logger.info('addFileToWatcher addFile = ' + addFile);
      let file = fs.openSync(addFile, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE | fs.OpenMode.TRUNC);
      fs.writeSync(file.fd, content);
      fs.closeSync(file);
    } catch (e) {
      Logger.error(TAG, `addFileToWatcher has failed for: {message: ${e.message}, code: ${e.code}}`);
    }
  }

(4)刪除文件

當對應用沙箱文件或文件夾添加IN_DELETE監聽后,在沙箱文件路徑下刪除一個文件,應用內則會打印出相應監聽日志,使用fs.unlink刪除文件。在沙箱路徑下刪除一個文件的具體實現方法如下所示:

src/main/ets/filemanager/fileFs/MyWatcher.ts:

deleteFileToWatcher(path: string): void {
    try {
      let deleteFile = this.baseDir + '/watcherDir/' + path;
      Logger.info(TAG, 'deleteFileToWatcher deleteFile = ' + deleteFile);
      fs.unlink(deleteFile).then(() => {
        Logger.info(TAG, 'deleteFileToWatcher file succeed');
      }).catch((err) => {
        Logger.info(TAG, 'deleteFileToWatcher file failed with error message: ' + err.message + ', error code: ' + err.codeor);
      });
    } catch (e) {
      Logger.error(TAG, `readyFileToWatcher has failed for: {message: ${e.message}, code: ${e.code}}`);
    }
  }

(5)修改文件

當對應用沙箱文件或文件夾添加IN_MODIFY監聽后,在沙箱文件路徑下對一個文件內容進行修改,應用內則會打印出相應監聽日志,(注意:若只修改文件名,應用內不會打印監聽日志)。使用fs.renameSync對文件名進行修改,使用fs.openSync打開文件,fs.writeSync方法對文件進行寫入內容,fs.closeSync關閉文件。在沙箱路徑下修改一個文件的具體實現方法如下所示:

src/main/ets/filemanager/fileFs/MyWatcher.ts:

modifyFileToWatcher(oldName: string, newName: string, content: string): number {
    // 重命名文件
    let filePath = null;
    if (newName.trim() === oldName.trim()) {
      filePath = this.baseDir + '/watcherDir/' + oldName;
      Logger.info('modifyFileToWatcher The new file name is the same as the old file name');
    } else {
      try {
        let srcFile = this.baseDir + '/watcherDir/' + oldName;
        Logger.info('modifyFileToWatcher srcFile = ' + srcFile);
        let dstFile = this.baseDir + '/watcherDir/' + newName;
        filePath = dstFile;
        Logger.info('modifyFileToWatcher dstFile = ' + dstFile);
        fs.renameSync(srcFile, dstFile);
      } catch (e) {
        Logger.info(`modifyFileToWatcher -readyFileRW-creat has failed for: {message: ${e.message}, code: ${e.code}}`);
      }
    }

    // 修改文件內容
    Logger.info('modifyFileContentToWatcher filePath = ' + filePath);
    try {
      /* 修改文件內容時必須以fs.OpenMode.TRUNC打開文件,如果文件存在且以只寫或讀寫的方式打開文件,則將其長度裁剪為零。這樣修改文件內容時,若修改后的文件        * 比修改前小,也會正確修改,否則修改后文件的文件比未修改前小時,則修改錯誤。
       */
      let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE | fs.OpenMode.TRUNC);
      let writeLen = fs.writeSync(file.fd, content);
      Logger.info('modifyFileContentToWatcher write data to file succeed and size is:' + writeLen);
      fs.closeSync(file);

      let fileRead = fs.openSync(filePath, fs.OpenMode.READ_WRITE);
      let buf = new ArrayBuffer(BUFFER);
      this.fileSize = fs.readSync(fileRead.fd, buf);
      let resultPut = bufferToString(buf);
      Logger.info('modifyFileContentToWatcher Read num = ' + this.fileSize);
      Logger.info('modifyFileContentToWatcher Read resultPut = ' + resultPut);
      fs.closeSync(fileRead);
      Logger.info('modifyFileContentToWatcher write data to file succeed and fileSize is:' + this.fileSize);
    } catch (e) {
      Logger.info(`-readyFileRW-creat has failed for: {message: ${e.message}, code: ${e.code}}`);
    }
    return this.fileSize;
  }
}

測試

sample功能完成之后,需要對開發完成的功能進行測試,此時就需要增加自動化測試用例實現對功能的基本測試。UiTest可以通過簡潔易用的API提供查找和操作界面控件能力,支持用戶開發基于界面操作的自動化測試腳本。如何編寫UI測試用例參考編寫UI測試腳本,測試執行完畢后可直接在DevEco Studio中查看測試結果,如下所示:

總結

通過使用這個示例,開發者可以快速掌握文件監聽的實現方法,并將其運用到自己的應用中,實現更強大和豐富的功能。同時,這個示例也提供了一個學習和交流的平臺,開發者可以與其他開發者分享經驗和技巧,共同推動OpenHarmony生態的發展。

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2023-06-09 15:24:50

UiTest接口鴻蒙

2023-06-20 15:40:58

系統開發鴻蒙

2021-06-24 14:41:16

鴻蒙HarmonyOS應用

2021-12-22 10:19:47

鴻蒙HarmonyOS應用

2024-03-26 15:25:55

應用接口文件轉換工具鴻蒙

2023-07-17 16:13:21

組件模塊開發的鴻蒙

2023-04-26 15:29:35

NAPI模塊鴻蒙

2023-06-20 15:45:15

服務卡片鴻蒙

2024-04-09 09:34:36

鴻蒙系統燒錄操作系統

2022-10-12 15:00:02

設備開發應用開發

2023-04-21 15:54:08

應用開發鴻蒙

2022-03-02 16:08:31

Harmony應用開發鴻蒙

2010-06-09 13:24:22

UML用例

2022-05-10 11:02:02

電話子系統鴻蒙

2022-01-21 21:22:24

OpenHarmon操作系統鴻蒙

2022-02-15 14:45:14

OpenHarmo系統鴻蒙

2022-11-04 14:58:59

應用開發鴻蒙

2022-10-24 14:54:29

LWIP協議鴻蒙

2021-05-06 05:39:30

Inotify監聽系統

2023-05-30 14:50:20

界面開發鴻蒙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: aaaa日韩 | 国产中文字幕在线 | 97avcc| 久久精品小视频 | 国产免费一区二区 | 欧美日韩久久 | 国产一区二区在线免费视频 | www日本高清 | 午夜免费精品视频 | 亚洲人成网站777色婷婷 | 青春草在线 | 九九av| 无毛av | 亚洲精品中文字幕 | 天天av综合| 91精品国产日韩91久久久久久 | 四虎在线播放 | 色婷综合网 | 亚洲欧洲精品在线 | 日韩和的一区二区 | 午夜精品久久久久久久久久久久 | 黄网站涩免费蜜桃网站 | 午夜午夜精品一区二区三区文 | 欧美在线一区二区三区 | 色狠狠一区| 国产 欧美 日韩 一区 | 日韩h| 国产精品高潮呻吟久久av黑人 | 欧美视频在线看 | 一级片在线视频 | 中文字幕精品一区二区三区精品 | 国产成人精品午夜视频免费 | 日韩欧美成人一区二区三区 | 另类视频在线 | 精品国产免费一区二区三区五区 | 精品久久一区 | 日本亚洲欧美 | 国产一区二区三区精品久久久 | 成人免费观看男女羞羞视频 | 国产精品久久久久久久免费观看 | 韩国av一区二区 |