æä»¬ç createSyncAccessHandle()
æ¨¡å¼æµè¯ç¤ºä¾æä¾äºä¸ä¸ª <input>
åæ®µæ¥è¾å
¥ææ¬ï¼ä»¥å两个æé®ââä¸ä¸ªç¨äºå°è¾å
¥çææ¬åå
¥åå§ç§ææä»¶ç³»ç»ä¸çæä»¶æ«å°¾ï¼å¦ä¸ä¸ªç¨äºå¨æä»¶å¤ªæ»¡æ¶æ¸
空æä»¶ã
å°è¯æ¢ç´¢ä¸é¢çæ¼ç¤ºï¼æå¼æµè§å¨å¼åè
æ§å¶å°ï¼ä»¥ä¾¿ä½ å¯ä»¥çå°æ£å¨åççäºæ
ãå¦æä½ å°è¯å¨å¤ä¸ªæµè§å¨æ ç¾é¡µä¸æå¼æ¼ç¤ºï¼ä½ ä¼åç°å¯ä»¥åæ¶æå¼å¤ä¸ªå¥æä»¥åæ¶åå
¥æä»¶ãè¿æ¯å ä¸ºå¨ createSyncAccessHandle()
è°ç¨ä¸è®¾ç½®äº mode: "readwrite-unsafe"
ã
ä¸é¢æä»¬å°æ¢ç´¢ä»£ç ã
HTML两个 <button>
å
ç´ åææ¬ <input>
åæ®µå¦ä¸æç¤ºï¼
<ol>
<li>
<label for="file-text">è¾å
¥è¦åå
¥æä»¶çææ¬ï¼</label>
<input type="text" id="file-text" name="file-text" />
</li>
<li>å°ä½ çææ¬åå
¥æä»¶ï¼<button class="write">åå
¥ææ¬</button></li>
<li>妿æä»¶å¤ªæ»¡ï¼åæ¸
空该æä»¶ï¼<button class="empty">æ¸
空æä»¶</button></li>
</ol>
主线ç¨ä¸ç JavaScript
HTML æä»¶ä¸çä¸»çº¿ç¨ JavaScript å¦ä¸æç¤ºãæä»¬è·å对åå
¥ææ¬æé®ãæ¸
空æä»¶æé®åææ¬è¾å
¥å段çå¼ç¨ï¼ç¶åä½¿ç¨ Worker()
æé 彿°å建ä¸ä¸ªæ°ç Web Workerãç¶åæä»¬å®ä¹ä¸¤ä¸ªå½æ°å¹¶å°å®ä»¬è®¾ç½®ä¸ºæé®ä¸çäºä»¶å¤çå¨ï¼
writeToOPFS()
ãæ¤å½æ°ä½¿ç¨ Worker.postMessage()
æ¹æ³å°ææ¬å段çè¾å
¥å¼åå¸å°å¯¹è±¡å
ç Workerï¼ç¶åæ¸
ç©ºææ¬åæ®µï¼ä¸ºä¸ä¸æ¬¡æ·»å å好åå¤ã请注æä¼ éç对象è¿å
å« command: "write"
屿§ï¼ä»¥æå®æä»¬æ³è¦ä½¿ç¨æ¤æ¶æ¯è§¦ååå
¥æä½ãemptyOPFS()
ãè¿ä¼å°å
å« command: "empty"
屿§ç对象åå¸å° Workerï¼æå®è¦æ¸
空æä»¶ãconst writeBtn = document.querySelector(".write");
const emptyBtn = document.querySelector(".empty");
const fileText = document.querySelector("#file-text");
const opfsWorker = new Worker("worker.js");
function writeToOPFS() {
opfsWorker.postMessage({
command: "write",
content: fileText.value,
});
console.log("主线ç¨èæ¬ï¼åéç» worker çææ¬");
fileText.value = "";
}
function emptyOPFS() {
opfsWorker.postMessage({
command: "empty",
});
}
writeBtn.addEventListener("click", writeToOPFS);
emptyBtn.addEventListener("click", emptyOPFS);
Worker 线ç¨ä¸ç JavaScript
worker JavaScript å¦ä¸æç¤ºã
é¦å
ï¼æä»¬è¿è¡ä¸ä¸ªå为 initOPFS()
ç彿°ï¼è¯¥å½æ°ä½¿ç¨ StorageManager.getDirectory()
è·å对 OPFS æ ¹ç®å½çå¼ç¨ï¼ä½¿ç¨ FileSystemDirectoryHandle.getFileHandle()
å建æä»¶å¹¶è¿åå
¶å¥æï¼ç¶åä½¿ç¨ createSyncAccessHandle()
è¿å FileSystemSyncAccessHandle
ãæ¤è°ç¨å
æ¬ mode: "readwrite-unsafe"
屿§ï¼å
许å¤ä¸ªå¥æåæ¶è®¿é®å䏿件ã
let accessHandle;
async function initOPFS() {
const opfsRoot = await navigator.storage.getDirectory();
const fileHandle = await opfsRoot.getFileHandle("file.txt", { create: true });
accessHandle = await fileHandle.createSyncAccessHandle({
mode: "readwrite-unsafe",
});
}
initOPFS();
å¨ worker ç message äºä»¶å¤çå¨ä¸ï¼æä»¬é¦å
ä½¿ç¨ getSize()
è·åæä»¶ç大å°ãç¶åï¼æä»¬æ£æ¥æ¶æ¯ä¸åéçæ°æ®æ¯å¦å
å« command
屿§å¼ "empty"
ã妿æ¯ï¼æä»¬ä½¿ç¨ truncate()
æ¸
空æä»¶ï¼å¼ä¸º 0
ï¼å¹¶æ´æ° size
åéä¸å
å«çæä»¶å¤§å°ã
å¦ææ¶æ¯æ°æ®æ¯å ¶ä»å å®¹ï¼æä»¬ï¼
TextEncoder
å TextDecoder
æ¥å¤çç¨åå¯¹ææ¬å
容çç¼ç åè§£ç ãwrite()
å¯¹æ¶æ¯æ°æ®è¿è¡ç¼ç å¹¶å°ç»æåå
¥æä»¶æ«å°¾ï¼ç¶åæ´æ° size
åéä¸å
å«çæä»¶å¤§å°ãDataView
æ¥å
嫿件å
容ï¼å¹¶ä½¿ç¨ read()
å°å
容读å
¥å
¶ä¸ãDataView
å
容并å°å
¶è®°å½å°æ§å¶å°ãonmessage = function (e) {
console.log("Workerï¼ä»ä¸»çº¿ç¨æ¶å°æ¶æ¯");
// è·åæä»¶å½å大å°
let size = accessHandle.getSize();
if (e.data.command === "empty") {
// å°æä»¶æªæä¸º 0 åè
accessHandle.truncate(0);
// è·åæä»¶å½å大å°
size = accessHandle.getSize();
} else {
const textEncoder = new TextEncoder();
const textDecoder = new TextDecoder();
// 对è¦åå
¥æä»¶çå
容è¿è¡ç¼ç
const content = textEncoder.encode(e.data.content);
// 卿件æ«å°¾åå
¥å
容
accessHandle.write(content, { at: size });
// è·åæä»¶å½å大å°
size = accessHandle.getSize();
// å夿件é¿åº¦çæ°æ®è§å¾
const dataView = new DataView(new ArrayBuffer(size));
// å°æ´ä¸ªæä»¶è¯»å
¥æ°æ®è§å¾
accessHandle.read(dataView, { at: 0 });
// å°å½åæä»¶å
容记å½å°æ§å¶å°
console.log("æä»¶å
容ï¼" + textDecoder.decode(dataView));
// å·æ°æ´æ¹
accessHandle.flush();
}
// å°æä»¶ç大å°è®°å½å°æ§å¶å°
console.log("大å°ï¼" + size);
};
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4