Emscripten中的虚拟文件系统
一、加载文件(读数据)
使用fopen,fread等操作。
编译选项中添加:
--preload-file a.data
二、写数据
只有MEMFS文件系统是默认包含的,其他必须使用链接标志使能。
NODEFS: -lnodefs.js
IDBFS: -lidbfs.js
WORKERFS: -lworkerfs.js
PROXYFS: -lproxyfs.js
1、MEMFS
- 在运行时初始化时,MEMFS是默认挂载在“/”目录下的文件系统。
- 所有文件都严格存在于内存中,当重新加载页面时,写入它们的任何数据都会丢失。
2、NODEFS
- NODEFS文件系统只运行在node.js环境中
- NODEFS允许通过挂载操作,将主机文件系统上的目录映射到Emscripten的虚拟文件系统中的目录。
- 它使用节点的同步FS API将写入Emscripten文件系统的任何数据写到本地磁盘。
代码示例:
/** Copyright 2013 The Emscripten Authors. All rights reserved.* Emscripten is available under two separate licenses, the MIT license and the* University of Illinois/NCSA Open Source License. Both these licenses can be* found in the LICENSE file.*/#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <emscripten.h>#ifdef NODERAWFS
#define CWD ""
#else
#define CWD "/working/"
#endifint main() {FILE *file;int res;char buffer[512];// write something locally with nodeEM_ASM(var fs = require('fs');fs.writeFileSync('foobar.txt', 'yeehaw'););#ifndef NODERAWFS// mount the current folder as a NODEFS instance// inside of emscriptenEM_ASM(FS.mkdir('/working');FS.mount(NODEFS, { root: '.' }, '/working'););
#endif// read and validate the contents of the filefile = fopen(CWD "foobar.txt", "r");assert(file);res = fread(buffer, sizeof(char), 6, file);assert(res == 6);fclose(file);assert(!strcmp(buffer, "yeehaw"));// write out something newfile = fopen(CWD "foobar.txt", "w");assert(file);res = fwrite("cheez nihao webassembly", sizeof(char), 20, file);assert(res == 20);fclose(file);// validate the changes were persisted to the underlying fsEM_ASM(var fs = require('fs');var contents = fs.readFileSync('foobar.txt', { encoding: 'utf8' });assert(contents === 'cheez'););puts("success");return 0;
}
编译和运行
编译: emcc test_nodefs_rw.c -o test_nodefs_rw.js -lnodefs.js -s FORCE_FILESYSTEM=1 -s INITIAL_MEMORY=64mb
运行: node test_nodefs_rw.js
3、IDBFS
- IDBFS文件系统只运行在浏览器中
- IDBFS文件系统实现了FS.syncfs()接口,当调用该接口时,将把任何操作持久化到IndexedDB实例。
- 这样做是为了克服浏览器不提供持久存储同步api的限制,因此(默认情况下)所有写操作仅临时存在于内存中。
4、WORKERFS
- WORKERFS只云习惯在worker线程中
- 这个文件系统提供了对worker内部的file和Blob对象的只读访问,而不需要将整个数据复制到内存中,并且可以用于巨大的文件。
Emscripten中的虚拟文件系统相关推荐
- linux文件体系结构和虚拟文件系统
linux中的虚拟文件系统(Virtual File System, VFS)是一种采用面向对象编程策略(尽管书写操作系统的C语言本身不支持面向对象编程,但是思想还是可以借鉴的),是对该操作系统所支持 ...
- Emscripten中的文件系统
跨平台的C/C++程序常使用fopen().fread().fwrite()等Libc/LibCXX提供的同步文件访问函数.通常在文件系统方面,JavaScript程序与C/C++本地程序有巨大的差异 ...
- 【Linux 内核】Linux 操作系统结构 ( Linux 内核在操作系统中的层级 | Linux 内核子系统及关系 | 进程调度 | 内存管理 | 虚拟文件系统 | 网络管理 | 进程间通信 )
文章目录 一.Linux 内核在操作系统中的层级 二.Linux 内核子系统 三.Linux 内核子系统之间的关系 一.Linux 内核在操作系统中的层级 Linux 内核 所在层级 : 整个计算机系 ...
- Asp.Net中虚拟文件系统的使用
在Asp.Net的开发过程中页面文件等都是放在当前网站目录下的,其实我们可以利用.Net2.0新增的虚拟文件系统(VirtualPathProvider)将页面.图片等信息保存到数据库或其他目录中去, ...
- Gox语言中使用内存虚拟文件系统提升IO处理速度-GX43.1
Gox语言中,1.06a版本以上,可以利用内置的github.com/topxeq/afero包来将内存中虚拟出一个文件系统.这样,如果内存足够大,完全可以利用它来提升一些文件IO处理的效率. 该包实 ...
- 虚拟文件系统(VFS)
原文链接:http://www.orlion.ga/1008/ linux在不同的文件系统之上做了一个抽象层,使得文件.目录.读写访问等概念都成为抽象层概念,这个抽象层被称为虚拟文件系统(VFS). ...
- Linux虚拟文件系统简介
本文将对Linux下的VFS做一个简单介绍,主要包括VFS里面的一些概念,以及文件系统是如何与VFS交互的. 本文所涉及的代码摘自Linux-4.4.0-59 什么是VFS VFS的全称为virtua ...
- Linux内核设计与实现笔记(一) 虚拟文件系统、块I/O层
虚拟文件系统 系统内所有文件系统不但依赖VFS共存,而且也依靠VFS系统协同工作. VFS使得用户可以直接使用open/read/write等系统调用,而无需考虑具体文件系统和实际物理介质. VFS中 ...
- Linux虚拟文件系统解析
概述 虚拟文件系统(Virtual Filesystem Switch,简称VFS)所有的数据结构都是在运行以后建立的,并在卸载时删除,在磁盘中并没有存储这些数据结构.虚拟文件系统只有和实际文件系统( ...
最新文章
- eBay测试老兵的修炼之道:如何从测试“小工”到测试“专家”?
- Android屏幕方向调整的两种方式
- 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-9底层驱动之USART
- 牛客网(剑指offer) 第十七题 树的子结构
- TypeScript 2.1发布
- 高光谱图像pca降维_高光谱图像的数据特性之探讨
- 操作系统之I/O管理:4、缓冲区管理(单缓冲、双缓冲、循环缓冲、缓冲池)
- [ERROR CRI]: unable to check if the container runtime at “/var/run/dockershim.sock“
- laravel 任务队列_Laravel 队列系统实现及使用教程
- 备战2019年数据库系统工程师从什么时候开始合适?
- 软件测试——全链路压测原理
- 在计算机中 总线简称,微机中的总线一般分为几等
- 详解JavaScript的五种继承方式
- 用循环写出九九乘法表格。
- Exoplayer的详细使用UI篇
- Python 基础部分(三)
- 数据分析统计学原理第十二章:多个比例的比较、独立性及拟合优度检验 | 我的统计学原理复习日记
- 简单的指针二叉查找树和数组二叉查找树
- 许一世情 陪你 浪尽天涯
- 2d游戏和 3d游戏的区别
热门文章
- SLF4J: The requested version 1.5.8 by your slf4j binding is not compatible with [1.6] SLF4J: See htt
- 汇编创建Win32窗体
- linux内核崩溃+grub,Linux内核崩溃信息分析
- C++中的面向对象(四大基本特征与五大原则)
- C语言学习笔记(十九)
- 【BYM】Android 仿百度搜索列表滑动效果,flutter环境搭建
- 支付宝APP支付Java服务端
- 转载--近几年的论文及其代码
- 嵌入式linux的软件毕设论文,嵌入式linux远程控制机器人_毕设论文.doc
- TensorFlow2.0--Chapter01环境搭建