electron 实现文件下载管理器(1)

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

electron 实现文件下载管理器

主进程实现代码:

/**

  • 打开文件选择框

  • @param oldPath - 上一次打开的路径

*/

const openFileDialog = async (oldPath: string = app.getPath(‘downloads’)) => {

if (!win) return oldPath

const { canceled, filePaths } = await dialog.showOpenDialog(win, {

title: ‘选择保存位置’,

properties: [‘openDirectory’, ‘createDirectory’],

defaultPath: oldPath,

})

return !canceled ? filePaths[0] : oldPath

}

ipcMain.handle(‘openFileDialog’, (event, oldPath?: string) => openFileDialog(oldPath))

渲染进程代码:

const path = await ipcRenderer.invoke(‘openFileDialog’, ‘PATH’)

3.2 暂停/恢复和取消

================

拿到 downloadItem 后,暂停、恢复和取消分别调用 pause、resume 和 cancel 方法。当我们要删除列表中正在下载的项,需要先调用 cancel 方法取消下载。

3.3 下载进度

============

在 DownloadItem 中监听 updated 事件,可以实时获取到已下载的字节数据,来计算下载进度和每秒下载的速度。

// 计算下载进度

const progress = item.getReceivedBytes() / item.getTotalBytes()

electron 实现文件下载管理器

在下载的时候,想在 Mac 系统的程序坞和 Windows 系统的任务栏展示下载信息,比如:

  • 下载数:通过 app 的 badgeCount 属性设置,当为 0 时,不会显示。也可以通过 dock 的 setBadge 方法设置,该方法支持的是字符串,如果不要显示,需要设置为 ‘’。

  • 下载进度:通过窗口的 setProgressBar 方法设置。

由于 Mac 和 Windows 系统差异,下载数仅在 Mac 系统中生效。加上 process.platform === ‘darwin’ 条件,避免在非 Mac、Linux 系统下出现异常错误。

下载进度(Windows 系统任务栏、Mac 系统程序坞)显示效果:

electron 实现文件下载管理器

electron 实现文件下载管理器

// mac 程序坞显示下载数:

// 方式一

app.badgeCount = 1

// 方式二

app.dock.setBadge(‘1’)

// mac 程序坞、windows 任务栏显示进度

win.setProgressBar(progress)

3.4 下载速度

============

由于 downloadItem 没有直接为我们提供方法或属性获取下载速度,需要自己实现。

思路:在 updated 事件里通过 getReceivedBytes 方法拿到本次下载的字节数据减去上一次下载的字节数据。

// 记录上一次下载的字节数据

let prevReceivedBytes = 0

item.on(‘updated’, (e, state) => {

const receivedBytes = item.getReceivedBytes()

// 计算每秒下载的速度

downloadItem.speed = receivedBytes - prevReceivedBytes

prevReceivedBytes = receivedBytes

})

需要注意的是,updated 事件执行的时间约 500ms 一次。

electron 实现文件下载管理器

3.5 下载完成

============

当一个文件下载完成、中断或者被取消,需要通知渲染进程修改状态,通过监听 downloadItem的 done 事件。

item.on(‘done’, (e, state) => {

downloadItem.state = state

downloadItem.receivedBytes = item.getReceivedBytes()

downloadItem.lastModifiedTime = item.getLastModifiedTime()

// 通知渲染进程,更新下载状态

webContents.send(‘downloadItemDone’, downloadItem)

})

3.6 打开文件和打开文件所在位置

=====================

使用 electron 的 shell 模块来实现打开文件(openPath)和打开文件所在位置(showItemInFolder)。

由于 openPath 方法支持返回值 Promise,当不支持打开的文件,系统会有相应的提示,而 showItemInFolder 方法返回值是 void。如果需要更好的用户体验,可使用 nodejs 的 fs 模块,先检查文件是否存在。

import fs from ‘fs’

// 打开文件

const openFile = (path: string): boolean => {

if (!fs.existsSync(path)) return false

shell.openPath(path)

return true

}

// 打开文件所在位置

const openFileInFolder = (path: string): boolean => {

if (!fs.existsSync(path)) return false

shell.showItemInFolder(path)

return true

}

3.7 文件图标

============

如何快速更新自己的技术积累?

  • 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
  • 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
  • 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
  • 学习以后不知道有没有学成,则可以通过面试去检验。

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!**

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目

[外链图片转存中…(img-Nh7w1VKf-1714420934155)]

[外链图片转存中…(img-zEPnMg66-1714420934155)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值