fs.mkdir创建目录报错

本文解析了在Node.js中使用fs.mkdirSync创建多级目录时遇到的问题及解决方法。指出mkdirSync不能直接创建不存在的父目录,需逐层创建。

fs.mkdir创建不了多层目录?

最近在实现上一章博客:
《前端性能优化之图片压缩详细流程(工作实用)》
https://blog.youkuaiyun.com/fearlessxmm/article/details/89443129
的时候遇到一个问题:mkdir创建不了目录,总是报找不到该文件的错。

源目录:
在这里插入图片描述
在执行gulp任务时,流程中有一个步骤是需要创建dist/img/目录:
主要代码如下:

fs.mkdirSync('dist/img/');

在这里插入图片描述
但是,执行任务时,终端报错了:

[22:27:32] Error: ENOENT: no such file or directory, mkdir 'dist/img/'

在这里插入图片描述
明明逻辑没错,使用fs.mkdirSync('dist/img/');创建这样一个目录,但是就是报错了。
重点:(敲黑板
查了资料才知道,
目录要一层一层的创建从源目录截图知道,一开始没有dist文件夹的,所以执行创建目录操作时,是要先创建dist文件夹,再创建子目录img的。
所以修改代码如下:

// 目录要一层一层的创建
    fs.mkdirSync('dist/');
    fs.mkdirSync('dist/img/');

在这里插入图片描述
成功!
在这里插入图片描述
总结:
fs.mkdir可以创建多层目录,但是要一层一层地创建。

我写的报错了:"ErrnoError",帮我看看有什么问题,我写的:cript type="text/javascript"> const curloc = document.location.href; const curdir = curloc.substring(0, curloc.lastIndexOf('/')); let pyodide, commandCode = null let gameWidth = 1038; let gameHeight = 815; const screenLoc = localStorage.getItem('screen') || {} const screenObj =JSON.parse(JSON.stringify(screenLoc)) if(Object.keys(screenObj).length ){ gameWidth = JSON.parse(screenObj).width gameHeight = JSON.parse(screenObj).height } console.log('screenObj',gameWidth,gameHeight); async function loadDirectory(pyodideInstance, baseUrl, targetPath) { try { console.log(baseUrl) const response = await fetch(baseUrl); if (!response.ok) { throw new Error(`Failed to fetch directory: ${response.status}`); } const html = await response.text(); const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); const links = doc.querySelectorAll('a'); // 确保目标目录存在 try { pyodideInstance.FS.mkdir(targetPath); } catch (mkdirErr) { // 如果目录已存在,忽略错误 if (mkdirErr.errno !== 20) { console.warn('创建目录失败:', mkdirErr); } } for (const link of links) { const href = link.getAttribute('href'); if (href && !href.endsWith('/') && !href.includes('?')) { const fileUrl = `${baseUrl}${href}`; const filePath = `${targetPath}/${href}`; // 确保文件路径的父目录存在 const dirPath = filePath.substring(0, filePath.lastIndexOf('/')); try { pyodideInstance.FS.mkdir(dirPath); } catch (dirErr) { // 如果目录已存在,忽略错误 if (dirErr.errno !== 20) { console.warn('创建目录失败:', dirErr); } } const fileResponse = await fetch(fileUrl); if (!fileResponse.ok) { console.warn(`Failed to fetch file: ${fileUrl}`); continue; } const buffer = await fileResponse.arrayBuffer(); pyodideInstance.FS.writeFile(filePath, new Uint8Array(buffer)); //console.log(`Loaded: ${filePath}`); } } } catch (error) { console.error('Error loading directory:', error); } } async function loadCharacterAssets(pyodideInstance) { const assetFolders = [ { baseUrl: '../../assets/', targetPath: '/home/pyodide/assets' }, { baseUrl: '../../assets/man/', targetPath: '/home/pyodide/assets/man' }, { baseUrl: '../../assets/man/down/', targetPath: '/home/pyodide/assets/man/down' }, { baseUrl: '../../assets/man/left/', targetPath: '/home/pyodide/assets/man/left' }, { baseUrl: '../../assets/man/right/', targetPath: '/home/pyodide/assets/man/right' }, { baseUrl: '../../assets/man/up/', targetPath: '/home/pyodide/assets/man/up' }, { baseUrl: '../../assets/level_1_1/background/', targetPath: '/home/pyodide/assets/level_1_1/background' }, { baseUrl: '../../assets/block/', targetPath: '/home/pyodide/assets/block' }, { baseUrl: '../../assets/card/', targetPath: '/home/pyodide/assets/card' }, { baseUrl: '../../assets/font/', targetPath: '/home/pyodide/assets/font' }, { baseUrl: '../../assets/message/', targetPath: '/home/pyodide/assets/message' }, { baseUrl: '../../assets/foe/', targetPath: '/home/pyodide/assets/foe' }, { baseUrl: '../../assets/icon/', targetPath: '/home/pyodide/assets/icon' } ]; for (const folder of assetFolders) { await loadDirectory(pyodideInstance, folder.baseUrl, folder.targetPath); } } console.log(`等待python加载`); async function main(){ initStatus('loading') try{ pyodide = await loadPyodide(); await pyodide.loadPackage(["pygame-ce"], { checkIntegrity: false }); canvas = document.getElementById("canvas"); pyodide.canvas.setCanvas2D(canvas); pyodide.FS.mkdir('/home/pyodide/assets'); pyodide.FS.mkdir('/home/pyodide/assets/level_1_1/background'); pyodide.FS.mkdir('/home/pyodide/assets/icon'); pyodide.FS.mkdir('/home/pyodide/assets/man'); pyodide.FS.mkdir('/home/pyodide/assets/card'); pyodide.FS.mkdir('/home/pyodide/assets/block'); pyodide.FS.mkdir('/home/pyodide/assets/font'); pyodide.FS.mkdir('/home/pyodide/assets/message'); pyodide.FS.mkdir('/home/pyodide/assets/foe'); pyodide.FS.mkdir('/home/pyodide/assets/icon'); pyodide.FS.mkdir('/home/pyodide/assets/man/down'); pyodide.FS.mkdir('/home/pyodide/assets/man/idle'); pyodide.FS.mkdir('/home/pyodide/assets/man/left'); pyodide.FS.mkdir('/home/pyodide/assets/man/right'); pyodide.FS.mkdir('/home/pyodide/assets/man/up'); pyodide.FS.mkdir('/home/pyodide/assets/man/attack'); pyodide.FS.mkdir('/home/pyodide/assets/man/shovel'); // 加载资源 await loadCharacterAssets(pyodide); // 加载字体 const fontFiles = [ 'assets/font/SimHei.ttf' ]; pyodide.globals.set("gameWidth", gameWidth); pyodide.globals.set("gameHeight", gameHeight); for (const fontPath of fontFiles) { const response = await fetch(fontPath); const buffer = await response.arrayBuffer(); const fileName = fontPath.split('/').pop(); const fullPath = `/home/pyodide/assets/font/${fileName}`; pyodide.FS.writeFile(fullPath, new Uint8Array(buffer)); } function resizeGameWindow(width, height) { pyodide.globals.get("global_game").resize_window(width, height); }
最新发布
11-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值