如何确定文件或文件夹是否在SSD或硬盘上?

时间:2018-06-20 11:18:59

标签: c++ windows winapi

如何在C或C ++中以编程方式确定指定路径是在闪存(SSD)驱动器上还是在磁性硬盘驱动器上?我只对固定驱动器感兴趣,而不对可移动驱动器感兴趣,尽管同样可以确定可移动驱动器的类型。

我可以看到获取指定结束路径的根卷路径的方法,以及获取该卷的GUID的方法,但是我没有找到查询该卷的硬件特性的方法。

1 个答案:

答案 0 :(得分:0)

鉴于OP在回答我的评论时说了我don't think this is the right question

相反,这里真正重要的是seek time,也许还有包含要加载的映像的磁盘的延迟(请参见上面的注释)。

当然,SSD没有寻找时间或等待时间,因此需要并行解码多个图像(在单独的线程中)以充分利用CPU。但是OP告诉我们,这样做会导致传统硬盘的性能下降 ,这可能是因为磁盘头在各处乱跳,试图使所有解码线程都收到数据。 / p>

那么,您能同时拥有两全其美吗?您能否在不使磁盘不稳定的情况下充分利用CPU?好吧,我想是的,是的。我要做的是有一个单个线程,一次将图像读取到内存中,以保持磁盘快乐。

但是该线程应该只读取“原始”图像数据。任何进一步的处理都应分配给一定数量的“工人”线程(确切的数量可能应限于计算机所具有的逻辑处理器的数量),以便可以并行进行。然后,它们应该全部在任何类型的磁盘上运行。

这就是我要说的。 OP,您需要设计一些排队/调度体系结构,但这是值得的。

如果您只想在Windows上运行此程序,请签出ThreadPool,或考虑使用std::async(它与C ++标准相反是基于线程池的顶部,并提供了不错的C ++传递值语义)。

否则,请查看C++ Thread support library


编辑:对于OP来说,这显然是相当多的工作,请参见注释。因此,短期建议,找到某种使磁盘不稳定的方法,并测量经过的时间来决定是否并行加载图像或一次处理图像。

只需并行加载一些图像即可。在开发过程中,同时在HDD和SSD上进行测量,然后就可以确定一个(硬编码)值,用作阈值。

注意:执行此操作时,请使用FILE_FLAG_NO_BUFFERING打开文件,否则磁盘缓存可能会骗您。

对不起,我在那里传道了。有时候我必须知道需求。