久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    harmonyos 操作文件

     oskycar 2024-08-10 發布于北京

    場景描述

    開發過程中可能需要在native側實現資源訪問,應用經常會遇到如下的業務訴求:

    場景一:c++訪問公共目錄的文件圖片等資源(圖庫和文管)

    場景二:c++訪問沙箱文件/圖片等資源

    場景三:c++訪問應用包里的文件/圖片資源 rawfile和resource

    場景一:c++訪問公共目錄的文件圖片等資源(圖庫和文管)

    一、獲取擁有讀/寫權限的文件URI,當前需要在arkts側獲取并通過NAPI的方式將uri傳遞給C++側,如通過picker獲取對應uri,再將uri傳遞到c++側。

    二、使用FileManagement\_ErrCode OH\_FileUri\_GetPathFromUri根據uri獲取對應的文件路徑。

    //將傳入的uri轉換成路徑path。
    FileManagement_ErrCode OH_FileUri_GetPathFromUri (const char * uri, unsigned int length, char ** result )

    三、使用C++標準的文件接口打開文件。

    fp = fopen(path, "r");

    場景二:c++訪問沙箱文件/圖片等資源

    一、獲取沙箱路徑

    方式一:通過arkts側傳遞

    在應用arkts側,提供了ApplicationContext對象,可獲取沙箱路徑:

    應用arkts側

    在ApplicationContext對象中獲取應用沙箱路徑,傳遞應用沙箱路徑到Native C++側。

    let applicationContext = getContext().getApplicationContext(); // 獲取應用上下文對象
    let filesDir = applicationContext.filesDir; // 應用通用文件路徑
    let cacheDir = applicationContext.cacheDir; // 應用緩存文件路徑
    let tempDir = applicationContext.tempDir; // 應用臨時文件路徑

    備注:目前NDK并沒有提供獲取ApplicationContext的接口,無法直接獲取應用沙箱路徑。

    方式二:拼接

    根據應用沙箱目錄的[規范](https:///openharmony/docs/blob/master/zh-cn/applicat...),在Native C++側定義完整的沙箱路徑。如:/data/app/el2/100/base/{包名}/haps/entry/files/test.txt

    二、根據沙箱路徑打開文件/圖片等資源

    參考場景一的使用C++標準的文件接口打開文件,path傳入對應文件所在的沙箱路徑。

    fp = fopen(path, "r");

    場景三:c++訪問應用包里的文件/圖片資源(rawfile和resource)

    一、js側傳入對應的資源管理對象resourceManager

    獲取本應用包資源resourceManager對象的示例如下:

    private resmgr = getContext().resourceManager;  // 獲取本應用包的資源對象

    二、獲取文件/資源路徑一般是由開發者自行規劃的,可由開發者自行拼接。在傳遞ResourceManger的同時傳遞了對應的文件夾名稱。

    let rawfilelist = testNapi.getFileList(this.resmgr, "rawdir"); //傳入資源對象,以及訪問的rawfile文件夾名稱

    三、C++側訪問rawfile和resource下的資源文件

    通過arkts傳入的resourceManager訪問資源文件,整個過程按照以下步驟進行:

    1、初始化resourceManager2、打開rawfile文件初始化:

    NativeResourceManager *manager = OH_ResourceManager_InitNativeResourceManager(env, args[0]);

    為使用OH\_ResourceManager\_OpenRawFile打開rawfile文件(mNativeResMgr為js傳入的resourceManager):

    RawFile *rawFile = OH_ResourceManager_OpenRawFile(mNativeResMgr, filename.c_str());
    if (rawFile != nullptr) {
      OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "OH_ResourceManager_OpenRawFile success");
    }

    使用OH\\_ResourceManager\\_GetRawFileSize獲取rawfile大小并申請內存:

    long len = OH_ResourceManager_GetRawFileSize(rawFile);
    std::unique_ptr<uint8_t[]> data= std::make_unique<char[]>(len);

    讀取rawfile:方式一:使用OH\_ResourceManager\_ReadRawFile一次性讀取rawfile全部內容:

    int res = OH_ResourceManager_ReadRawFile(rawFile, data.get(), len);

    方式二:使用OH\\_ResourceManager\\_ReadRawFile多次部分讀取rawfile, 每次讀取100 Byte。獲取全部內容:

    long offset = 0;
    while (OH_ResourceManager_GetRawFileRemainingLength(rawFile) > 0) {
      OH_ResourceManager_ReadRawFile(rawFile, data.get() + offset, 100);
      offset += 100;
    }

    使用OH\_ResourceManager\_CloseRawFile關閉打開的指針對象:

    OH_ResourceManager_CloseRawFile(rawFile);
    OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);

    轉為arkts對象(可以根據這個arkts對象在arkts側調用):

    return CreateJsArrayValue(env, data, len);

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 日本道精品一区二区三区| 国产在沙发上午睡被强| 麻豆一二三区精品蜜桃| 国内不卡一区二区三区| 一級特黃色毛片免費看| 爆乳无码AV一区二区三区| 亚洲精品男男一区二区| 日韩AV无码精品一二三区| 国产免费看插插插视频| 老司机午夜精品视频资源| 免费人成在线观看网站| 国产精品福利自产拍久久| 黑巨茎大战俄罗斯美女| 欧洲亚洲精品免费二区| 亚洲VA中文字幕无码久久不卡| 99久久无码私人网站| 国产精品久久久久久久网| 小12萝8禁用铅笔自慰喷水| 国产日韩久久免费影院| 亚洲精品国自产拍在线观看 | 天天夜碰日日摸日日澡性色AV | 少妇xxxxx性开放| 一本一本久久A久久精品综合不卡| 美女内射毛片在线看免费人动物| 婷婷色香五月综合缴缴情香蕉| 欧美一进一出抽搐大尺度视频| 国产一区二区三区导航| 亚洲国产成人影院播放| 国产线观看免费观看| 欧美国产日产一区二区| 狠狠色噜噜狠狠亚洲AV| 国产稚嫩高中生呻吟激情在线视频| 英语老师解开裙子坐我腿中间| 国产成人A在线视频免费| 男人狂桶女人出白浆免费视频 | 国产精品未满十八禁止观看| 欧美日韩精品一区二区三区不卡| 亚洲人妻一区二区精品| 国产精品久久毛片| 久久精品国产亚洲AV麻豆长发| 一区二区三区不卡国产|