如何在Electron-vue应用程序中为fs.readdir(路径)指定另一个磁盘?

时间:2018-01-27 22:22:08

标签: node.js vue.js electron

问题:

我有一个breadcrumbs组件(我正在使用来自this project的文件资源管理器功能)。问题是我不知道如何更改它显示的磁盘。

当我点击其中的任何路径时,我明白了:

Uncaught (in promise) Error: Path does not exist

所以在ls.js文件中我更改了这段代码:

export function readdir (path) {
  return pathExists(path)
    ? fs.readdir(path)
    : Promise.reject(new Error('Path does not exist'))
}

要使用此代码查看它正在尝试阅读的内容:

export function readdir (path) {
  return fs.readdir(path)
}

因此事实证明,显示C:磁盘是硬编码的。我不知道如何使它动态化(显示任何指定磁盘的内容)。

  • 现在,如果我点击面包屑组件中的C: > Users路径,我就会:

Uncaught (in promise) Error: ENOENT: no such file or directory, scandir 'E:\Users'

  • 我尝试过这样做:fs.readdir("/" + path)但它给了我这个错误:

Uncaught (in promise) Error: ENOENT: no such file or directory, scandir 'E:\C:\Users\

  • 项目文件夹位于 E:磁盘

  • 而面包屑显示 C:磁盘的内容

ls.js文件:

import fs from 'fs-extra'
import { join } from 'path'

/**
 * Get Array for path contents. Checks if path exists
 * @param  {String} path
 * @return {Promise}
 */
export function readdir (path) {
  return  fs.readdir(path)
}

/**
 * Alias of fs.existsSync
 * @param  {String} path
 * @return {Boolean}
 */
export function pathExists (path) {
  return fs.existsSync(path)
}

/**
 * Get path stat
 * @param  {String} path
 * @return {Promise}
 */
export function stat (path) {
  return fs.stat(path)
}

/**
 * Take in file path and return contents with stat
 * @param  {String} path
 * @return {Array}
 */
export default path => {
  return new Promise((resolve, reject) => {
    const contents = []

    readdir(path).then(files => {
      let statsPromises = []

      files.forEach(file => {
        statsPromises.push(stat(join(path, file)))
      })

      Promise.all(statsPromises).then(stats => {
        stats.forEach((stat, i) => {
          contents.push({
            name: files[i],
            path: join(path, files[i]),
            stat
          })
        })

        resolve(contents)
      })
    })
  })
}

1 个答案:

答案 0 :(得分:1)

如果您查看 Breadcrumbs.vue ,您会在底部看到以下方法。

placePath () {
    return this.$store.state.Place.path
}

在那里你可以看到路径是从状态中获取的。状态位于 Place.js 文件中。

此状态路径在 Place.vue 文件中初始化。在那里,您将看到如下方法。

load (path = this.$electron.remote.app.getPath('home')) {
    path = join(path)
    this.$store.dispatch('getContents', path).then(() => {
      this.$store.commit('setPlacePath', path)
    }, err => {
      console.error(err)
      this.$route.push('/')
    })
  }

路径来自以下行。 的 this.$electron.remote.app.getPath('home')

以上 app.getPath() 方法的电子documentation如下。

  

app.getPath(name)

     
      
  • name字符串
  •   
     

返回String - 指向特定目录或文件的路径   与name。失败时会抛出Error

     

您可以通过名称请求以下路径:

     
      
  • home用户的主目录。
  •   
  • appData每个用户的应用程序数据目录,默认情况下指向:* * %APPDATA%在Windows * $XDG_CONFIG_HOME或   Linux上的~/.config * macOS上的~/Library/Application Support
  •   
  • userData用于存储应用程序配置文件的目录,默认情况下是附加到您的appData目录   应用程序的名称。
  •   
  • temp临时目录。
  •   
  • exe当前的可执行文件。
  •   
  • module libchromiumcontent库。
  •   
  • desktop当前用户的桌面目录。
  •   
  • documents用户目录"我的文档"。
  •   
  • downloads用户下载目录。
  •   
  • music用户音乐目录。
  •   
  • pictures用户照片的目录。
  •   
  • videos用户视频的目录。
  •   
  • logs应用程序日志文件夹的目录。
  •   
  • pepperFlashSystemPlugin Pepper Flash插件系统版本的完整路径。
  •   

所以这些是您作为起始目录的选项。

更新:

this.$electron.remote.app.getAppPath() 将返回当前的应用程序目录。

load (path = this.$electron.remote.app.getAppPath()) {
    path = join(path)
    this.$store.dispatch('getContents', path).then(() => {
      this.$store.commit('setPlacePath', path)
    }, err => {
      console.error(err)
      this.$route.push('/')
    })
  }

更新2:

请注意我也是电子新手。似乎app.getPath方法用于获取路径应用程序正在运行。如果你想要一个不同的路径,你可以在那里硬编码。

示例:

注意' / home / rajind' 硬编码为路径参数的默认值。

Place.js file

getContents ({ commit }, path = '/home/rajind') {
    return new Promise((resolve, reject) => {
      ls(path).then(contents => {
        commit('setContents', contents)
        resolve()
      }, err => {
        reject(err)
      })
    })
  }

并在Place.vue文件中,

 load (path = '/home/rajind') {
    path = join(path)
    this.$store.dispatch('getContents', path).then(() => {
      this.$store.commit('setPlacePath', path)
    }, err => {
      console.error(err)
      this.$route.push('/')
    })
  }