Electron-vue应用中如何为fs.readdir(path)指定其他磁盘?
解决面包屑组件切换磁盘时的路径错误问题
你的问题核心在于Windows系统下的磁盘盘符路径没有被正确解析,导致切换到C盘后,子路径被错误拼接在项目所在的E盘目录下,生成了E:\C:\Users或E:\Users这类无效路径。下面是具体分析和修复方案:
问题根源拆解
- 项目运行在E盘,Node.js默认工作目录是项目根目录,当传入
Users这类相对路径时,fs.readdir会自动拼接为E:\Users,而非你期望的C:\Users。 - 之前移除
pathExists检查的操作,不仅丢失了明确的错误提示,还没解决路径解析的核心问题。 - 面包屑组件大概率在传递路径时,没有维护完整的盘符绝对路径(比如点击C盘的Users时,只传了
Users而非C:\Users)。
修复步骤
1. 修正ls.js的路径解析逻辑
我们需要确保所有路径都被解析为绝对路径,让Node.js正确识别Windows盘符格式。修改后的完整代码如下:
import fs from 'fs-extra' import { join, resolve } from 'path' /** * Get Array for path contents. Checks if path exists * @param {String} path * @return {Promise} */ export function readdir (path) { // 解析为绝对路径,确保Windows盘符路径被正确识别 const absolutePath = resolve(path); return pathExists(absolutePath) ? fs.readdir(absolutePath) : Promise.reject(new Error('Path does not exist')) } /** * Alias of fs.existsSync with absolute path resolution * @param {String} path * @return {Boolean} */ export function pathExists (path) { return fs.existsSync(resolve(path)) } /** * Get path stat with absolute path resolution * @param {String} path * @return {Promise} */ export function stat (path) { return fs.stat(resolve(path)) } /** * Take in file path and return contents with stat * @param {String} path * @return {Array} */ export default path => { const absolutePath = resolve(path); return new Promise((resolve, reject) => { const contents = [] readdir(absolutePath) .then(files => { const statsPromises = files.map(file => stat(join(absolutePath, file))) return Promise.all(statsPromises).then(stats => ({ files, stats })) }) .then(({ files, stats }) => { stats.forEach((stat, i) => { contents.push({ name: files[i], path: join(absolutePath, files[i]), stat }) }) resolve(contents) }) .catch(reject) // 统一捕获错误并传递 }) }
关键修改说明:
- 用
path.resolve()处理所有传入路径:对于C:\Users这类盘符绝对路径,会直接保留;对于相对路径,会基于当前工作目录解析,但配合组件的路径传递逻辑,就能避免错误拼接。 - 恢复
pathExists检查并同步做绝对路径解析,确保路径存在性判断准确。 - 优化Promise链式调用,让代码更简洁且统一处理错误。
2. 调整面包屑组件的路径传递逻辑
确保组件始终传递完整的绝对路径:
- 点击
C:时,传递C:\给readdir。 - 点击
C: > Users时,传递C:\Users而非Users。 - 如果组件之前用相对路径拼接,需修改逻辑:维护当前选中的磁盘根路径(比如
currentRoot = 'C:\'),子路径拼接为join(currentRoot, 'Users')。
验证方案
- 运行修改后的代码,点击面包屑的
C:,确认能正确加载C盘根目录内容。 - 点击
Users,检查控制台是否还有ENOENT错误,此时应成功加载C:\Users的内容。
内容的提问来源于stack exchange,提问作者Un1
相关产品推荐
相关产品推荐

