å®å ¨ä¸ä¸æ: æ¤é¡¹åè½ä» å¨ä¸äºæ¯æçæµè§å¨çå®å ¨ä¸ä¸æï¼HTTPSï¼ä¸å¯ç¨ã
夿³¨ï¼ æ¤ç¹æ§å¨ Web Worker ä¸å¯ç¨ã
æä»¶ç³»ç» APIï¼File System APIï¼ââ以åéè¿æä»¶ç³»ç»è®¿é® APIï¼File System Access APIï¼æä¾çæ©å±æ¥è®¿é®è®¾å¤æä»¶ç³»ç»ä¸çæä»¶ââå è®¸ä½¿ç¨æä»¶è¯»å以åæä»¶ç®¡çåè½ã
请åé ä¸å ¶ä»æä»¶ç¸å ³ API çå ³ç³»ï¼ä»¥äºè§£æ¤ APIãæä»¶åç®å½æ¡ç® API åæä»¶ API ä¹é´çåºå«ã
æ¦å¿µä¸ç¨æ³æ¤ API å 许ç¨åºä¸ç¨æ·æ¬å°è®¾å¤ä¸çææ¯ç¨æ·è½å¤è®¿é®çç½ç»æä»¶ç³»ç»ä¸çæä»¶è¿è¡äº¤äºãæ¤ API çæ ¸å¿åè½å æ¬è¯»åæä»¶ãåå ¥æä¿åæä»¶ä»¥å访é®ç®å½ç»æã
大夿°ä¸æä»¶åç®å½ç交äºé½éè¿å¥ææ¥å®æãç¶ç±» FileSystemHandle
æ´¾çåºä¸¤ä¸ªåç±»ï¼FileSystemFileHandle
å FileSystemDirectoryHandle
ï¼åå«è¡¨ç¤ºæä»¶å¥æåç®å½å¥æã
ä¸ä¸ªå¥æä»£è¡¨äºç¨æ·æä½ç³»ç»ä¸çä¸ä¸ªæä»¶æç®å½ãä½ å¯ä»¥éè¿è°ç¨è¯¸å¦ window.showOpenFilePicker()
å window.showDirectoryPicker()
ä¸ç±»çæ¹æ³åç¨æ·æ¾ç¤ºä¸ä¸ªæä»¶éæ©å¨æç®å½éæ©å¨ï¼ä»¥æ¤æ¥è·å¾å¥æã䏿¦è°ç¨äºè¿äºå½æ°ï¼éæ©å¨å°±ä¼åºç°ï¼ç¨æ·å¯ä»¥ç¨å®éæ©ä¸ä¸ªæä»¶æç®å½ãåªè¦è¿ä¸ªæ¥éª¤æå宿ï¼å°±ä¼è¿å奿ã
ä½ è¿å¯ä»¥ä»ä»¥ä¸éå¾è·å¾å¥æï¼
DataTransferItem.getAsFileSystemHandle()
æ¹æ³ãæ¯ç§å¥æé½æä¾äºå ¶ç¬æçåè½ï¼åå³äºä½ 使ç¨çç§ç±»ï¼ä¼æäºè®¸å·®å¼ï¼è¯¦è§æ¥å£é¨åï¼ãå¨è·å¾å¥æåï¼ä½ 便å¯ä»¥è®¿é®æä»¶çæ°æ®ææ¯è¢«éä¸çç®å½çä¿¡æ¯ï¼å å«åç®å½ï¼ãæ¤ API å¼è¾äº web æ¤åä¸ç´ç¼ºä¹çæ½å¨åè½ãä½ä¸è®ºå¦ä½ï¼å®å ¨æ§æ¯è®¾è®¡ API æ¶çé¦è¦èéï¼é¤éç¨æ·æç¡®ææï¼å¦åå°±ä¸å è®¸è®¿é®æä»¶åç®å½çæ°æ®ï¼æ³¨æï¼æºç§ææä»¶ç³»ç»å¹¶é妿¤ï¼å ä¸ºå ¶å¯¹ç¨æ·ä¸å¯è§ï¼ã
夿³¨ï¼ ä½¿ç¨æ¤ API çç¹æ§æ¶å¯è½ä¼æåºçåç§å¼å¸¸å·²å¨è§èå®ä¹çç¸å ³é¡µé¢ä¸ååºãç¶èï¼API ä¸åºå±æä½ç³»ç»ç交äºä½¿å¾å®é æ 嵿´å 夿ãè¿éæä¾ä¸ç¯å ³äºå¨è§èä¸ååºé误对åºè¡¨çæè®®ï¼å ¶ä¸å å«äºä¸äºæç¨çä¿¡æ¯ã
夿³¨ï¼ åºäº FileSystemHandle
ç对象è½å¤è¢«åºåååå¨è³ IndexedDB æ°æ®åºå®ä¾ä¸ï¼ä¹å¯ä»¥éè¿ postMessage()
ä¼ éã
æºç§ææä»¶ç³»ç»ï¼origin private file systemï¼OPFSï¼å±äºæä»¶ç³»ç» APIï¼æä¾äºé¡µé¢æå±çæºä¸ç¨çåå¨ç«¯ç¹ï¼å¹¶ä¸ä¸åå¸¸è§æä»¶ç³»ç»é£æ ·å¯¹ç¨æ·å¯è§ã宿ä¾å¯¹ä¸ç§ç»è¿é«åº¦æ§è½ä¼åçç¹æ®æä»¶ç访é®è½åçéæ©ï¼ä¾å¦ï¼å¯¹æä»¶å 容çåå°åå ¥è®¿é®ã
以䏿¯ä¸äºå¯è½çç¨ä¾ï¼
å ·ææä¹ ä¸ä¼ ç»ä»¶çåºç¨
å½éæ©è¦ä¸ä¼ çæä»¶æç®å½æ¶ï¼ä½ å¯ä»¥å°æä»¶å¤å¶å°æ¬å°æ²çä¸å¹¶ä¸æ¬¡ä¸ä¼ ä¸ä¸ªåã
åºç¨å¯ä»¥å¨ä¸æåéæ°å¯å¨ä¸ä¼ ï¼ä¾å¦æµè§å¨å ³éæå´©æºãè¿æ¥ä¸ææè®¡ç®æºå ³æºã
å ·æå¤§éåªä½éæèµæºçè§é¢æ¸¸ææå ¶ä»åºç¨
åºç¨ä¸è½½ä¸ä¸ªæå¤ä¸ªå¤§å tar å å¹¶å°å ¶æ¬å°å±å¼ä¸ºç®å½ç»æã
åºç¨å¨åå°é¢å è·åéæèµæºï¼å æ¤ç¨æ·æ éçå¾ ä¸è½½å³å¯è¿å ¥ä¸ä¸ä¸ªä»»å¡ææ¸¸æçº§å«ã
æ¯æç¦»çº¿è®¿é®ææ¬å°ç¼åçé³é¢æç §çç¼è¾å¨ï¼æ§è½åé度æä½³ï¼
离线è§é¢æ¥çå¨
离线 Web é®ä»¶å®¢æ·ç«¯
请é 读æä»¬çæºç§ææä»¶ç³»ç»ï¼ä»¥äºè§£å¦ä½ä½¿ç¨å®ã
ä¿åæä»¶FileSystemWritableFileStream
æ¥å£ãå½ä½ æ³è¦ä¿åçæ°æ®æ¯ Blob
ãString
对象ãå符串åé¢éæ buffer
å½¢å¼çæ¶åï¼ä½ å¯ä»¥æå¼ä¸ä¸ªåå
¥æµææ°æ®ä¿åå°æä»¶ãå¯ä»¥æ¯å·²ç»åå¨çæä»¶ï¼ä¹å¯ä»¥æ¯æ°æä»¶ãFileSystemSyncAccessHandle
ï¼ä½¿ç¨ write()
æ¹æ³åå
¥æ´æ¹ãä½ è¿å¯ä»¥éæ©è°ç¨ flush()
ä»¥ä½¿æ´æ¹å¨æå®çæ¶é´ç¹åå
¥ç£çï¼æè
ä½ ä¹å¯ä»¥è®©åºå±æä½ç³»ç»å¨å
¶è®¤ä¸ºåéçæ¶é´ç¹æ§è¡åå
¥ï¼è¿ä¹å大夿°æ
åµä¸åºè¯¥é½ä¸ä¼æé®é¢ï¼ãFileSystemChangeRecord
å®éªæ§
å
å« FileSystemObserver
è§å¯å°çåä¸ªæ´æ¹ç详ç»ä¿¡æ¯ã
FileSystemHandle
代表æä»¶æç®å½æ¡ç®ç对象ãå¤ä¸ªå¥æå¯ä»¥æä»£åä¸ä¸ªæ¡ç®ã大夿°æ
åµä½ é½ä¸ä¼ç´æ¥ç¨å° FileSystemHandle
ï¼èæ¯ä¼ç¨å°å®çåæ¥å£ FileSystemFileHandle
å FileSystemDirectoryHandle
ã
FileSystemFileHandle
æä¾ä¸ä¸ªæä»¶ç³»ç»æ¡ç®ç奿ã
FileSystemDirectoryHandle
æä¾ä¸ä¸ªæä»¶ç³»ç»ç®å½ç奿ã
FileSystemObserver
å®éªæ§
æä¾ä¸ç§è§å¯æéæä»¶æç®å½çååçæºå¶ã
FileSystemSyncAccessHandle
æä¾ä¸ä¸ªæä»¶ç³»ç»æ¡ç®ç忥奿ï¼ç¨äºå¨ç£çä¸åå°æä½å个æä»¶ãå ¶å¨æä»¶è¯»åä¸çåæ¥ç¹æ§å¯å¨å¼æ¥æä½å¼éè¾å¤§çæ æ¯ä¸ä½¿å ³é®æ¹æ³æ¥ææ´ä¼ç§çæ§è½ï¼ä¾å¦ WebAssemblyãæ¤ç±»åªè½å¨ä¸ç¨äºæä½æºç§ææä»¶ç³»ç»ä¸çæä»¶çä¸ç¨ Web Worker ä¸è®¿é®ã
FileSystemWritableFileStream
ä¸ä¸ªéå äºä¾¿äºæä½ç£çä¸å个æä»¶çæ¹æ³ç WritableStream
对象ã
Window.showDirectoryPicker()
æ¾ç¤ºå è®¸ç¨æ·éæ©ç®å½çç®å½éæ©å¨ã
Window.showOpenFilePicker()
æ¾ç¤ºå è®¸ç¨æ·éæ©ä¸ä¸ªæå¤ä¸ªæä»¶çæä»¶éæ©å¨ã
Window.showSaveFilePicker()
æ¾ç¤ºå è®¸ç¨æ·ä¿åæä»¶çæä»¶éæ©å¨ã
DataTransferItem.getAsFileSystemHandle()
è¿å Promise
ï¼å¦ææå¨çé¡¹ç®æ¯æä»¶ï¼åå
ç° FileSystemFileHandle
ï¼å¦ææå¨çé¡¹ç®æ¯ç®å½ï¼åå
ç° FileSystemDirectoryHandle
ã
StorageManager.getDirectory()
ç¨äºè·å对 FileSystemDirectoryHandle
对象çå¼ç¨ï¼è¯¥å¯¹è±¡å
许访é®åå¨å¨æºç§ææä»¶ç³»ç»ä¸çç®å½åå
¶å
容ãè¿åä¸ä¸ªå
ç° FileSystemDirectoryHandle
对象ç Promise
ã
以ä¸ä»£ç å è®¸ç¨æ·å¨æä»¶éæ©å¨ä¸éæ©ä¸ä¸ªæä»¶ã
async function getFile() {
// æå¼æä»¶éæ©å¨å¹¶ä»ç»æä¸è§£æåºç¬¬ä¸ä¸ªå¥æ
const [fileHandle] = await window.showOpenFilePicker();
const file = await fileHandle.getFile();
return file;
}
ä¸é¢ç弿¥å½æ°å¯ä»¥æ¾ç¤ºä¸ä¸ªæä»¶éæ©å¨ï¼å¹¶å¨éæ©äºæä»¶æ¶ä½¿ç¨ getFile()
æ¹æ³åå¾å
容ã
const pickerOpts = {
types: [
{
description: "Images",
accept: {
"image/*": [".png", ".gif", ".jpeg", ".jpg"],
},
},
],
excludeAcceptAllOption: true,
multiple: false,
};
async function getTheFile() {
// æå¼æä»¶éæ©å¨å¹¶ä»ç»æä¸è§£æåºç¬¬ä¸ä¸ªå¥æ
const [fileHandle] = await window.showOpenFilePicker(pickerOpts);
// è·åæä»¶å
容
const fileData = await fileHandle.getFile();
}
访é®ç®å½
ä¸é¢ç示ä¾è½å¤å徿å®åç§°çç®å½ç奿ï¼å¦æç®å½ä¸åå¨ï¼åå建ã
const dirName = "directoryToGetName";
// å设æä»¬å·²ç»æä¸ä¸ªç®å½å¥æï¼âcurrentDirHandleâ
const subDir = currentDirHandle.getDirectoryHandle(dirName, { create: true });
ä¸é¢ç弿¥å½æ°ä½¿ç¨ resolve()
æ¥æ¥æ¾è¢«éæ©æä»¶ç¸å¯¹äºæå®ç®å½å¥æçè·¯å¾ã
async function returnPathDirectories(directoryHandle) {
// éè¿æ¾ç¤ºæä»¶éæ©å¨æ¥è·å¾ä¸ä¸ªæä»¶å¥æ
const [handle] = await self.showOpenFilePicker();
if (!handle) {
// å¦æç¨æ·åæ¶äºéæ©æè
æå¼æä»¶å¤±è´¥
return;
}
// æ£æ¥æä»¶å¥ææ¯å¦åå¨äºç®å½å¥æçç®å½ä¸
const relativePaths = await directoryHandle.resolve(handle);
if (relativePaths === null) {
// ä¸å¨ç®å½å¥æä¸
} else {
// relativePaths æ¯ä¸ä¸ªå
å«åç§°çæ°ç»ï¼æç¤ºç¸å¯¹è·¯å¾
for (const name of relativePaths) {
// æå°æ°ç»çæ¯ä¸ªå
ç´
console.log(name);
}
}
}
åå
¥æä»¶
以ä¸å¼æ¥å½æ°è½å¤æå¼ä¸ä¸ªæä»¶éæ©å¨ï¼å¹¶å¨éæ©äºæä»¶æ¶è¿åä¸ä¸ª FileSystemFileHandle
ãç¶åä½¿ç¨ FileSystemFileHandle.createWritable()
æ¹æ³å建ä¸ä¸ªåå
¥æµã
ç¶åå°ç¨æ·å®ä¹çä¸ä¸ª Blob
åå
¥æµä¸ï¼éåå
³é该æµã
async function saveFile() {
// å建ä¸ä¸ªæ°å¥æ
const newHandle = await window.showSaveFilePicker();
// å建ä¸ä¸ª FileSystemWritableFileStream ç¨äºåå
¥
const writableStream = await newHandle.createWritable();
// åå
¥æä»¬çæä»¶
await writableStream.write(imgBlob);
// å
³éæä»¶å¹¶å°å
容åå
¥å°ç£ç
await writableStream.close();
}
ä¸é¢ç示ä¾å±ç¤ºè½å¤å write()
æ¹æ³ä¼ éçä¸åé项ã
// åªä¼ éæ°æ®ï¼æ²¡æé项ï¼
writableStream.write(data);
// 念䏿å®ä½ç½®åå
¥æ°æ®
writableStream.write({ type: "write", position, data });
// å°æä»¶å½åçæéæ´æ°å°æå®çåç§»ä½ç½®
writableStream.write({ type: "seek", position });
// è£åæä»¶çåèé¿åº¦ä¸º size åéç大å°
writableStream.write({ type: "truncate", size });
å¨ OPFS ä¸åæ¥è¯»åæä»¶
è¿ä¸ªç¤ºä¾å±ç¤ºå¦ä½å¨æºç§ææä»¶ç³»ç»ä¸åæ¥è¯»åæä»¶ã
以ä¸å¼æ¥äºä»¶å¤ç彿°å¤äº Web Worker ä¸ä¸æï¼ä»ä¸»çº¿ç¨æ¥æ¶æ¶æ¯ã
ArrayBuffer
æ¥å®¹çº³å®ãonmessage = async (e) => {
// è·åä»ä¸»çº¿ç¨åå¾ worker çæ¶æ¯
const message = e.data;
// è·å OPFS ä¸è稿æä»¶ç奿
const root = await navigator.storage.getDirectory();
const draftHandle = await root.getFileHandle("draft.txt", { create: true });
// è·ååæ¥è®¿é®å¥æ
const accessHandle = await draftHandle.createSyncAccessHandle();
// è·åæä»¶å¤§å°
const fileSize = accessHandle.getSize();
// å°æä»¶å
容读åå°ç¼å²åº
const buffer = new DataView(new ArrayBuffer(fileSize));
const readBuffer = accessHandle.read(buffer, { at: 0 });
// å°æ¶æ¯åå
¥å°æä»¶æ«å°¾
const encoder = new TextEncoder();
const encodedMessage = encoder.encode(message);
const writeBuffer = accessHandle.write(encodedMessage, { at: readBuffer });
// å°æ´æ¹æä¹
åè³ç£ç
accessHandle.flush();
// ç¨å® FileSystemSyncAccessHandle è®°å¾æå®å
³é
accessHandle.close();
};
夿³¨ï¼ å¨è§èæ©æçæ¬ä¸ï¼FileSystemSyncAccessHandle
ç close()
ãflush()
ãgetSize()
å truncate()
被ä¸åé»è¾å°æå®ä¸ºå¼æ¥æ¹æ³ãæ¤é®é¢ç°å·²è¢«ä¿®æ£ï¼ä½æäºæµè§å¨ä¾ç¶æ¯æå¼æ¥çæ¬ã
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