本帖最后由 waahah 于 2024-12-12 07:22 编辑
谢邀哈,先说结论:由于浏览器内容安全策略CSP ,所以无法在无任何交互的情况下读取文件
但是可以使用File System Access API读取指定的文件目录来避免层层选择文件,通过配置起始目录(startIn )来尝试让用户更便捷地定位到指定文件所在目录,然后尝试引导用户手动确认就可以了,下面给出简短示例:
const options = {
types: [
{
description: 'javascript Files',
accept: {
'text/x-csrc': ['.js']
}
}
],
excludeAcceptAllOption: true,
multiple: false,
startIn: 'downloads'
};
async function readSpecificFile() {
try {
const [fileHandle] = await window.showOpenFilePicker(options);
const file = await fileHandle.getFile();
if (file.name === '你的文件.js') {
const reader = new FileReader();
reader.onload = function (e) {
const fileContent = e.target.result;
console.log('文件内容如下:', fileContent);
};
reader.readAsText(file);
} else {
console.error('选择的文件不是指定的.js文件');
}
} catch (error) {
console.error('文件选择或读取出现错误:', error);
}
}
readSpecificFile();
至于浏览器监测USB设备的插入和拔出等信息可以采用轮询的方式来实现
let connectedDevices = [];
async function checkUSBDevices() {
try {
const devices = await navigator.usb.getDevices();
const newDevices = devices.filter(device => !connectedDevices.some(d => d.device !== device.device));
const removedDevices = connectedDevices.filter(device => !devices.some(d => d.device === device.device));
if (newDevices.length > 0) {
console.log('新设备插入:', newDevices);
}
if (removedDevices.length > 0) {
console.log('设备拔出:', removedDevices);
}
connectedDevices = devices;
} catch (error) {
console.error('检测 USB 设备时出错:', error);
}
}
setInterval(checkUSBDevices, 2000);
处理USB连接数据
try {
const device = await navigator.usb.requestDevice({ filters: [{ vendorId: 0x1234 }] });
await device.open();
await device.selectConfiguration(1);
await device.claimInterface(0);
document.getElementById('status').innerText = '已连接到设备: ' + device.productName;
const result = await readData(device);
console.log(result);
} catch (error) {
console.error(error);
document.getElementById('status').innerText = '错误: ' + error;
}
async function readData(device) {
const transferIn = await device.transferIn(5, 64);
const decoder = new TextDecoder();
return decoder.decode(transferIn.data);
}
|