用Electron开发一个文件浏览器(一)

首先先看看这个文件浏览器长什么样子

用Electron开发一个文件浏览器(一)_第1张图片

然后上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通过调用fsreaddir方法,从而我们可以在回调函数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目录下的所有分好类的文件对象。

你可能感兴趣的