拔掉u盘_U盘到底需不需要安全弹出?为了回答这个问题我做了个实验

25bd4f64d32631a578b79e4200402eab.png

为了保护U盘,我们往往会拔出U盘前会手动选择"安全弹出",不过上周微软表示在五月份windows10大更新中将去除外设存储设备"安全删除"的选项,默认添加"快速删除"的功能,此后用户可以直接拔出U盘,无需再点击"安全弹出"。

34ba74501daf7f35053c3713ba73d3ce.png

该更新被网友评论为最无聊的更新,那么直接拔出U盘真的会对数据产生破坏吗?我们不妨来看看。

以下实验用移动硬盘代替U盘,效果是一样的,实验对象是一个757MB的压缩包,系统环境windows10.0,版本号为17134。

实验一:文件传输过程中拔出移动硬盘

实测在传输过程突然拔掉移动硬盘,将会提示"没有找到项目",然后电脑上也找不到已经传输过半的文件,windows系统会把该文件已传输的部分也删除。另外移动硬盘内的文件完好,没有遭到破坏。

bcaeac1aad9beb1292fb7c5434b9d797.png

实验二:文件传输完成后一瞬间快速拔掉移动硬盘

为什么要做这个实验呢,因为windows系统在传输完数据后一小段时间内还在和外设存储设备进行交互,缓冲整理文件信息。

通过3次实验,结果都一致,电脑和移动硬盘内的文件没有丢失,一切正常。

04aec5e242f0982b4aced0fe2c646f66.png

为了实验的严谨,我们增加了一个5.8GB大文件测试,就是提高了windows在文件传输完成后的处理时间。结果和预期一样,文件信息完好。

95c4cdbde38845c0c800129e0bc422d6.png

通过上面两个简单的实验,我们正常的直接拔出U盘没有任何问题,但是这是建立在U盘支持热拔插的基础上,比如一些十块钱32GB的劣质扩容U盘,还需要谨慎操作!

最后建议大家不要这样蹂躏U盘,因为在拔出一瞬间U盘电路电压非常高,很有可能烧坏主板。另外微软对外设存储器采用了写入缓存技术,就算没有传输文件也有可能处于读取状态,容易导致数据丢失。经常性的直接拔出不仅对U盘会产生伤害,而且也会让U盘中病毒。

附:

1:那如果就是想要直接拔出而不损害数据,怎么办?

我们可以选择"快速删除"做到热拔插:控制面板-设备管理器-磁盘驱动器-右击U盘-属性-策略-快速删除

11d628b40ecd2e44b5bef26e9fdf752a.png

2:如何防止U盘中病毒?

在U盘内自己创建一个名字为autorun.inf的空文件夹,如果无法创建,U盘很可能已经中病毒。因为绝大多数病毒都会在U盘里自建一个名为autorun.inf的文件夹,然后以此文件夹作为中介入侵U盘。我们自己先建立autorun.inf文件夹也是一种防范措施。

55a5a389738fd28d1e917957f70ddaca.png

文:小z

审:小z

这个问题可以通过一些异常捕获和处理的机制来解决。你可以在加载数据库文件的代码处添加异常捕获的代码块来处理U盘拔出的情况,并在异常处理中给出一个友好的提示,告诉用户U盘已经被拔出,不能加载数据库文件。具体实现可以参考下面的代码: ```java try { // 加载U盘数据库文件的代码 // ... Intent intent = new Intent(this, ShowDataActivity.class); // 将数据库文件路径传递给展示数据的Activity intent.putExtra("db_path", dbPath); startActivity(intent); } catch (Exception e) { e.printStackTrace(); // 如果发生异常,说明U盘已经被拔出 Toast.makeText(this, "U盘已经被拔出,无法加载数据库文件", Toast.LENGTH_SHORT).show(); finish(); } ``` 在异常捕获中,我们首先打印异常的堆栈信息,方便调试和排查问题。然后给用户一个友好的提示,告诉他们U盘已经被拔出,不能加载数据库文件。最后,我们调用finish()方法结束当前的Activity,避免因为异常导致程序崩溃。 当然,为了更好的用户体验,你还可以在Activity的onPause()方法中添加代码来监听U盘拔出事件,并在用户拔出U盘时自动关闭当前的Activity。具体实现可以参考下面的代码: ```java private BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { // 如果U盘拔出,关闭当前的Activity finish(); } } }; @Override protected void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); registerReceiver(mUsbReceiver, filter); } @Override protected void onPause() { super.onPause(); unregisterReceiver(mUsbReceiver); } ``` 在上面的代码中,我们注册了一个BroadcastReceiver来监听U盘拔出事件。当U盘拔出时,会收到一个ACTION_USB_DEVICE_DETACHED的广播,我们在onReceive()方法中处理这个广播,并关闭当前的Activity。在onResume()方法中注册广播接收器,在onPause()方法中注销广播接收器,避免造成资源浪费。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值