在下载文件时,我们最好将这些文件存放在一个指定的文件夹中。
- 如果在项目中的根目录下创建一个文件夹存放,在打包时需要将这个文件夹一起打包出去。一些电脑存在权限问题,无法写入文件。
- 存放在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(),即使在下载图片前文件夹已经被手动删除了,我们调用此方法就能确保文件夹被创建,然后才能下载图片。