MPanelCtl项目中创建文件夹

16 篇文章 1 订阅
7 篇文章 0 订阅

在下载文件时,我们最好将这些文件存放在一个指定的文件夹中。

  • 如果在项目中的根目录下创建一个文件夹存放,在打包时需要将这个文件夹一起打包出去。一些电脑存在权限问题,无法写入文件。
  • 存放在c盘用户目录下,一般都可以写入。那么在项目启动时,我们就需要用户目录下合适的地方创建这么一个文件夹。
    每次下载时都要检查一下有没有这个文件夹(可能被手动删除了),没有就创建。

文件夹操作相关代码全部放在一个单独的文件中;

1、准备工作

首先从项目的package.json文件中导入项目的名字

import {name} from '../../package.json'
let appName = name;

判断环境,引入模块

if (global.hasOwnProperty('nw')) {
  var path = nw.require('path')
  var fs = nw.require('fs')
  var os = nw.require('os');
}else if (Meteor.isServer) {
  var path = require('path')
  var fs = require('fs')
  var os = require('os');
} else {
  inBrowserEnv = true;
}

判断是开发环境还是生成环境,因为开发环境和生成环境获取用户目录的路径不一样;

let mode;
if (process.env.NODE_ENV === 'development') {
  console.log('开发环境')
  mode='development'
} else if (process.env.NODE_ENV === 'production') {
  console.log('生产环境');
  mode='production'
}

然后我们在一个对象中暴露一些方法

export var UserFolder = {
。。。
}

2、获取用户目录下User Data文件夹路径

在里面定义一个获取用户目录下User Data文件夹路径的方法

createUserFolderPath() {
    let folderPath;
    switch (os.platform()) {
      case 'win32':
        folderPath = UserFolder.createPath_win32();
        break;
      case 'darwin':
        break;
      case 'linux':
        break;
      default:
        break;
    }
    return folderPath;
  },

系统不同,获取用户目录的方法也不同,我们只考虑win32;
我们要获取的路径是:用户目录→个人目录→AppData→Local→软件项目目录→User Data这个文件夹,
(软件安装后会在Local文件夹下创建一个同名文件夹)

在开发模式和生产模式下,获取用户目录是不一样的。

createPath_win32() {
    let folderPath;
    if (mode === 'development') {
      folderPath = path.join(process.env.LOCALAPPDATA, appName, 'User Data', '/');
    } else if (mode === 'production') {
      folderPath = path.join(process.env.HOMEDRIVE, process.env.HOMEPATH, 'AppData/Local/', appName, 'User Data', '/')
    }
    return folderPath;
  },

3、 创建缓存图片的文件夹

  async createImageFolder() {
    let folderPath = path.join(UserFolder.createUserFolderPath(), 'Image','/');;
    if (await FileUtil.isExsit(folderPath)) {//如果存在就直接返回
      return true;
    }
    console.log('尝试在用户目录创建缓存图片文件夹', folderPath);
    let res = await FileUtil.mkdirsSync(folderPath);
    if (res === true) {
      return true;
    } else {
      this.$message.error('No permission to create folder');
      return false;
    }
  },

1、生成存放图片的文件夹路径

如果此文件夹已经存在,就返回,不用生成了

2、创建文件夹

1、调用封装好的mkdirsSync方法同步(会阻塞)创建文件夹;这个方法是Meteor.call调用服务端的方法去创建文件夹;
2、创建文件最好放在服务端去执行,服务端的创建文件夹方法

mkdirsSync: function (dirname){
    try {
      fs.ensureDirSync(dirname)
    } catch (error) {
      console.error(error)
      return error
    }
    return true
  }

使用fs.ensureDirSync传入路径创建文件夹;
3、服务端的fs是引入的fs-extra,注意不是用的node的fs模块,node的fs模块没有ensureDirSync方法

let fs = require('fs-extra');

4、fs-extra添加了原生fs模块中没有包含的文件系统方法,并为fs方法添加了promise支持。它是fs的高级版;
5、ensureDirSync

  • ensureDirSync方法根据传入的路径创建文件夹,如果路径下文件夹存在了就不创建;
  • 如果目录结构不存在,则创建目录结构。这句话的意思是,在a/b/c路径创建文件夹,如果b文件夹都不存在,那么连b文件夹也给你创建出来。
    确保目录存在。如果目录结构不存在,则创建目录结构。如果提供,选项可以指定目录所需的模式。
    在下载文件时,我们最好将这些文件存放在一个指定的文件夹中。
  • 如果在项目中的根目录下创建一个文件夹存放,在打包时需要将这个文件夹一起打包出去。一些电脑存在权限问题,无法写入文件。
  • 存放在c盘用户目录下,一般都可以写入。那么在项目启动时,我们就需要用户目录下合适的地方创建这么一个文件夹。
    每次下载时都要检查一下有没有这个文件夹(可能被手动删除了),没有就创建。

文件夹操作相关代码全部放在一个单独的文件中;

4、在Home组件中使用

在created钩子中调用,
不在前端的main.js中调用是因为,创建文件夹是一个耗时的异步操作,不应在项目启动时再增加额外的阻塞,以免电脑在有些电脑启动出错(在我自己的电脑没有出错,但在测试的电脑启动可能会出错)

this.LOCAL_IMG_PATH=await UserFolder.createImageFolder();
if(!this.LOCAL_IMG_PATH){
      this.LOCAL_IMG_PATH=''
    }

在每个设计下载图片到文件夹的操作,都执行一次await UserFolder.createImageFolder(),即使在下载图片前文件夹已经被手动删除了,我们调用此方法就能确保文件夹被创建,然后才能下载图片。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值