You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron-vue应用中如何为fs.readdir(path)指定其他磁盘?

解决面包屑组件切换磁盘时的路径错误问题

你的问题核心在于Windows系统下的磁盘盘符路径没有被正确解析,导致切换到C盘后,子路径被错误拼接在项目所在的E盘目录下,生成了E:\C:\Users或E:\Users这类无效路径。下面是具体分析和修复方案:

问题根源拆解

  1. 项目运行在E盘,Node.js默认工作目录是项目根目录,当传入Users这类相对路径时,fs.readdir会自动拼接为E:\Users,而非你期望的C:\Users。
  2. 之前移除pathExists检查的操作,不仅丢失了明确的错误提示,还没解决路径解析的核心问题。
  3. 面包屑组件大概率在传递路径时,没有维护完整的盘符绝对路径(比如点击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')。

验证方案

  1. 运行修改后的代码,点击面包屑的C:,确认能正确加载C盘根目录内容。
  2. 点击Users,检查控制台是否还有ENOENT错误,此时应成功加载C:\Users的内容。

内容的提问来源于stack exchange,提问作者Un1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:53:45