fs.open HarmonyOS 鸿蒙Next

发布于 1周前 作者 zlyuanteng 来自 鸿蒙OS

fs.open HarmonyOS 鸿蒙Next

如何实现,文件不存在则创建,存在则清空内容,然后再写入,即覆盖写入的内容?  READ_ONLY | CREATE | TRUNC 都不行, 都是从文件头开始写入。  write之前调用 fdopenStream +w 也不行。  只能先删除再写入 ?

2 回复

使用TRUNC,就可以实现您说的清空内容,再重新写入内容。

如下demo,先创建并写入"hello, world"文本,再次执行第二个方法,会清空"hello, world",并重新写入"xxxx, xxxxxxxxxxxxxxxxxx"

import { filePreview } from '@kit.PreviewKit';
import { promptAction } from '@kit.ArkUI';
import { fileIo as fs, fileUri } from '@kit.CoreFileKit';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  private fileName: string = 'preview_info.txt';

  build() {
    Row() {
      Column() {
        Button('openPreview')
          .onClick(async () => {
            let context = getContext(this);
            let fileDir = context.filesDir; // 获取沙箱路径
            let filePath = fileDir + '/' + this.fileName;
            let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE | fs.OpenMode.TRUNC); // 创建文件
            let uri = fileUri.getUriFromPath(filePath); // 获取uri
            let str: string = "hello, world";
            let writeLen = fs.writeSync(file.fd, str); // 写入文件
            console.info("write data to file succeed and size is:" + writeLen);
            fs.closeSync(file);
            let result = await filePreview.canPreview(context, uri); // 传入uri,判断是否可预览
            if (result) {
              let previewInfo: filePreview.PreviewInfo = {
                title: this.fileName,
                uri: uri,
                mimeType: 'text/plain'
              }
              filePreview.openPreview(getContext(this), previewInfo); // 打开预览
            } else {
              promptAction.showToast({
                // 不可预览
                message: '文件不可预览'
              });
            }
          })
        Button('openPreview2')
          .onClick(async () => {
            let context = getContext(this);
            let fileDir = context.filesDir; // 获取沙箱路径
            let filePath = fileDir + '/' + this.fileName;
            let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE | fs.OpenMode.TRUNC); // 创建文件
            let uri = fileUri.getUriFromPath(filePath); // 获取uri
            let str: string = "xxxx, xxxxxxxxxxxxxxxxxx";
            let writeLen = fs.writeSync(file.fd, str); // 写入文件
            console.info("write data to file succeed and size is:" + writeLen);
            fs.closeSync(file);
            let result = await filePreview.canPreview(context, uri); // 传入uri,判断是否可预览
            if (result) {
              let previewInfo: filePreview.PreviewInfo = {
                title: this.fileName,
                uri: uri,
                mimeType: 'text/plain'
              }
              filePreview.openPreview(getContext(this), previewInfo); // 打开预览
            } else {
              promptAction.showToast({
                // 不可预览
                message: '文件不可预览'
              });
            }
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

更多关于fs.open HarmonyOS 鸿蒙Next的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对您提到的“fs.open HarmonyOS 鸿蒙Next”的问题,这里直接给出相关的专业解答:

在HarmonyOS(鸿蒙)系统中,fs.open通常不是一个直接暴露给应用开发者的API。HarmonyOS基于微内核设计,文件系统操作通常通过系统提供的API或框架来实现,而不是直接使用类似fs.open这样的低级函数。

如果您是在进行HarmonyOS的底层开发或系统级应用开发,并需要操作文件系统,您应该使用HarmonyOS SDK中提供的相应API。这些API可能包括用于打开、读取、写入和关闭文件的函数,但具体名称和使用方式会根据HarmonyOS的版本和API文档有所不同。

对于应用开发者来说,更常见的是通过HarmonyOS提供的框架和API来进行文件操作,而不是直接操作文件系统。这些框架和API通常会提供更高级别的抽象,使得文件操作更加简单和安全。

如果您是在进行HarmonyOS的底层开发,并且确实需要直接使用或了解fs.open类似的功能,那么您可能需要深入研究HarmonyOS的内核和文件系统实现。但请注意,这类开发通常需要较高的技术水平和深入的操作系统知识。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部