首先先看看这个文件浏览器长什么样子
然后上Github地址,源码都在这上面。
必须得说明的是,这个应用是看着《跨平台桌面应用开发–Electron与NW.js》来写的,这是书上的一个例子。不过因为书上更多侧重于演示,所以并不完善(当然我的代码也远说不上完善,目前只是补充了几个功能)。
文件浏览器打开时默认显示的是home目录。所以需要获取home目录路径。通过引入osenv
模块便可实现。
function getUserHomeFolder(){
return osenv.home();
}
home目录的路径是获取到了,那怎么让它显示在工具栏上呢?说实话,我脑海中的第一个想法是修改对应DOM节点的innerText
属性。可是后来我才发现,原来可以在网页中直接调用Node.js的代码。
<section id='current-folder'>
<script>
document.write(getUserHomeFolder());
script>
section>
像上面这个样子写就能直接将获得的home目录路径显示出来。
光获得个路径没有用,文件浏览器还得显示这个路径下都有哪些文件。因此还得获取某路径下的所有文件、文件夹,以及对它们做简单的分类。
function getFilesInFolder(folderPath, cb){
fs.readdir(folderPath, cb);
}
getFilesInFolder
通过调用fs
的readdir
方法,从而我们可以在回调函数cb
中获取到某路径下的所有文件、文件夹的路径组成的数组。
接下来我们还得对这些路径进行简单的分类,判断它们是文件还是文件夹,从而在之后可以正确的显示图标、
function inspectAndDescribeFile(filePath, cb){
let file = {
type: '',
path: '',
fileName: ''
}
fs.stat(filePath, (err, stat)=>{
if(err){
cb(err);
} else {
if(stat.isFile()){
result.type = 'file';
} else if(stat.isDirectory()){
result.type = 'directory';
}
cb(err, result);
}
});
}
上面这个方法可以分辨一个路径所代表的文件的类型,我们还需要一个函数对getFilesInFolder
方法返回的路径数组中的每一个元素都执行上面的方法。
function inspectAndDescribeFiles(folderPath, files, cb){
async.map(files, (file, asyncCb)=>{
let resolvedFilePath = path.resolve(folderPath, cb);
inspectAndDescribeFile(resolvedFilePath, asyncCb);
}, cb);
}
这个函数所需的cb
是在async.map
的回调函数,这个回调函数里可以获取到对files
中每一个元素执行完我们指定的操作之后所返回的新的数组。这个数组里的元素就是inspectAndDescribeFile
中所定义的file
,也就是被分好类的文件。
最后我们仅需要在入口函数里调用getFilesInFolder
即可。
function main(){
let folderPath = getUsersHomeFolder();
getFilesInFolder(folderPath, (err, files)=>{
inspectAndDescribeFiles(folderPath, files, (files)=>{
files.forEach(file => {
console.log(file);
});
});
});
}
这样输出的就是home目录下的所有分好类的文件对象。