HarmonyOS fs.Stat获取尺寸大小偏小?

let file = fs.openSync(ret.data.uri, fs.OpenMode.READ_WRITE);
let stat: fs.Stat = await fs.stat(file.fd);

通过此段代码获取的文件尺寸值偏小,导致尾部有一顿数据读取不到,大概小1kb左右。是否有相关示例参考?

阅读 530
1 个回答

示例参考如下:

import { fileIo as fs } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';

/**
 * 读取文件内容的异步方法
 * @param filePath 文件路径
 * @param fileMaxSize 文件最大尺寸,默认限制最大文件:100MB
 * @return 返回文件内容字符串,如果文件不存在或者文件过大,则返回undefined
 */
async function readText(filePath: string, fileMaxSize: number = 100 * 1024 * 1024): Promise<string | undefined> {
  try {
    // 检查文件是否存在
    if (!await fs.access(filePath)) {
      return undefined;
    }
    // 获取文件状态信息
    const stat: fs.Stat = await fs.stat(filePath);
    // 如果文件大小超过设定的最大尺寸,则返回undefined
    if (stat.size > fileMaxSize) {
      return undefined;
    }
    // 读取文件内容,并返回
    return fs.readText(filePath, { offset: 0, length: stat.size, encoding: 'utf-8' });
  } catch (err) {
  }
  return undefined;
}

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  @State res: string | undefined = ''

  build() {
    Scroll() {
      Column() {
        Text(this.message)
          .id('HelloWorld')
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .alignRules({
            center: { anchor: '__container__', align: VerticalAlign.Center },
            middle: { anchor: '__container__', align: HorizontalAlign.Center }
          })
          .onClick(async () => {
            let context = getContext(this) as common.UIAbilityContext
            let arrayBuff = context.resourceManager.getRawFileContentSync("1.html").buffer
            if (!context) {
              console.info("context is null");
              return;
            }
            let date = new Date();
            let name = date.getTime() + ".html"
            let sanPath = context.filesDir + "/" + name;
            let outputFile = fs.openSync(sanPath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
            fs.writeSync(outputFile.fd, arrayBuff);
            fs.closeSync(outputFile.fd);
            let res = await readText(sanPath)
            this.res = res
          })
        RichText(this.res)
      }
      .height('100%')
      .width('100%')
    }
  }
}
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<h1>H5侧</h1>
<div>
    <input type="button" value="发送String类型数据至应用侧" onclick="PostStringToEts();" style="margin:10px 0"/><br/>
    <input type="button" value="发送Object类型数据至应用侧" onclick="PostObjectToEts();" style="margin:10px 0"/><br/>
    <input type="button" value="发送Array类型数据至应用侧" onclick="PostArrayToEts();" style="margin:10px 0"/><br/>
    <input type="button" value="发送数组对象嵌套类型数据至应用侧" onclick="PostArrayObjectToEts();"
           style="margin:10px 0"/><br/>
    <input type="button" value="发送数异步数据至应用侧" onclick="PostAsynToEts();" style="margin:10px 0"/><br/>
</div>
<p>应用侧发送过来String类型的数据:<span class="output"></span></p>
<p>应用侧发送过来Object类型的数据:</p>
<p>
    <span>姓名:
        <span class="object-data1"></span>
    </span>
    <span>性别:
        <span class="object-data2"></span>
    </span>
    <span>年龄:
        <span class="object-data3"></span>
    </span>
</p>
<p>应用侧发送过来Array类型的数据:
<p class="array-data1"></p>
<p class="array-data2"></p>
<p class="array-data3"></p>
</p>
<p>应用侧发送过来数组对象类型的数据:
<p class="array-data4"></p>
<p class="array-data5"></p>
<p class="array-data6"></p>
</p>
</body>
<script>
    var h5Port;
    var output = document.querySelector('.output');
    var objectData1 = document.querySelector('.object-data1');
    var objectData2 = document.querySelector('.object-data2');
    var objectData3 = document.querySelector('.object-data3');
    var arrayData1 = document.querySelector('.array-data1');
    var arrayData2 = document.querySelector('.array-data2');
    var arrayData3 = document.querySelector('.array-data3');
    var arrayData4 = document.querySelector('.array-data4');
    var arrayData5 = document.querySelector('.array-data5');
    var arrayData6 = document.querySelector('.array-data6');
    window.addEventListener('message', function (event) {
        if (event.data === '__init_port__') {
            if (event.ports[0] !== null) {
                h5Port = event.ports[0]; // 1. 保存从应用侧发送过来的端口。
                h5Port.onmessage = function (event) {
                  // 2. 接收ets侧发送过来的消息。
                  var result = event.data;
                  let isObject = false;
                  let isArray = false;
                  let arr = [];
                  console.log(result);
                  try{
                    arr = JSON.parse(result);
                    isObject = true;
                    if(Array.isArray(arr)){
                      isArray = true;
                    }else{
                      isArray = false;
                    }
                  }
                  catch(error){
                    console.log(`error`);
                  }
                  if (typeof(result) === 'string' && !isObject) {
                    output.innerHTML = result;
                  } else if(typeof(result) === 'string' && isObject && !isArray){
                    // 应用侧侧传过来的是对象数据
                    let getObject = JSON.parse(result);
                    objectData1.innerHTML = getObject.name;
                     objectData2.innerHTML = getObject.age;
                      objectData3.innerHTML = getObject.sex;
                  }else if(typeof(result) === 'string' && isObject && isArray){
                    // H5侧传过来的是数组对象数据
                    if (JSON.parse(result)[0] !== '第一条数据' && JSON.parse(result)[0] !== '我是第一条数据'){
                      arrayData4.innerHTML = `姓名:${JSON.parse(result)[0].name} 性别:${JSON.parse(result)[0].sex} 年龄:${JSON.parse(result)[0].age}`;
                      arrayData5.innerHTML = `姓名:${JSON.parse(result)[1].name} 性别:${JSON.parse(result)[1].sex} 年龄:${JSON.parse(result)[1].age}`;
                      arrayData6.innerHTML = `姓名:${JSON.parse(result)[2].name} 性别:${JSON.parse(result)[2].sex} 年龄:${JSON.parse(result)[2].age}`;
                    }else{
                     // H5侧传过来的是数组数据
                       let getArray = JSON.parse(result);
                       arrayData1.innerHTML = getArray[0];
                       arrayData2.innerHTML = getArray[1];
                       arrayData3.innerHTML = getArray[2];
                     }
                  }
                }
            }
        }
    })
    // 3. 使用h5Port向应用侧发送String类型的数据。
    function PostStringToEts() {
        let stringData = '来自H5侧string类型的数据';
        if (h5Port) {
          h5Port.postMessage(stringData);
        } else {
          console.log('h5Port is null, Please initialize first');
        }
    }
    // 4、使用h5Port向应用侧发送object类型的数据。
     function PostObjectToEts() {
         let objData = {
              name:'张三',
              age:'18',
              sex:'男'
         }
        if (h5Port) {
          h5Port.postMessage(JSON.stringify(objData));
        } else {
          console.log('h5Port is null, Please initialize first');
        }
    }
     // 5、使用h5Port向应用侧发送Array类型的数据。
     function PostArrayToEts() {
         let arrData = ['第一条数据','第二条数据','第三条数据'];
        if (h5Port) {
          h5Port.postMessage(JSON.stringify(arrData));
        } else {
          console.log('h5Port is null, Please initialize first');
        }
    }
     // 6、使用h5Port向应用侧发送数组对象嵌套类型的数据。
     function PostArrayObjectToEts() {
         let arrObjData = [
             {
                  name:'peoPle1',
                  age:'18',
                  sex:'男'
             },
             {
                  name:'peoPle2',
                  age:'20',
                  sex:'男'
             },
             {
                  name:'peoPle3',
                  age:'22',
                  sex:'女'
             },
         ];
        if (h5Port) {
          h5Port.postMessage(JSON.stringify(arrObjData));
        } else {
          console.log('h5Port is null, Please initialize first');
        }
    }
     // 7、使用h5Port向应用侧发送异步数据。
      async function AsynData(){
          if (h5Port) {
            await h5Port.postMessage('倒计时3秒');
          } else {
            console.log('h5Port is null, Please initialize first');
          }
      }
    async function PostAsynToEts() {
        let stringData = '来自H5侧的异步数据';
        await AsynData();
        if (h5Port) {
          setTimeout(()=>{
            h5Port.postMessage(stringData);
          },3000)
        } else {
          console.log('h5Port is null, Please initialize first');
        }
    }
</script>
</html>
<style>
    body{
        width:100%;
        height:auto;
        margin:50px auto;
        text-align:center;
    }
</style>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进