文号
t53778
阅读
5717
回复
13
收藏
6
硬盘写速度测试器
2013/01/13
IP:湖北
之前有人发了个测试内存速度的程序
我再来个测试硬盘写速度的程序[s:274]
如图:(机械盘)
程序测试结果:
QK%DTMZ$K[V@~%U~Z2]DW45.jpg
写入文件时资源管理器显示的速度:
OW1S)HS5PO969V828][R90C.jpg
平时复制文件时,速度一般都30M/s
那是因为硬盘一边读一边写
测试时最好关闭不必要的程序,以免其他程序读盘,影响速度
一般测试机械盘选择1024M
固态盘没有,谁试试???100G就是为他准备的……
也可以测试U盘等移动设备
有些慢速的U盘可以选择1~10M
欢迎测试
另外,现在还没有想到如何删除测试文件,c语言函数试过了,
连system(“del……”)也试过了
甚至想到了自动建立一个批处理,
但是都无法直接删除……
提示进程无法访问……[s:218][s:245]
谁有好办法那???
程序和源码:
attachment icon 硬盘写速度测试器.zip 9.10KB ZIP 26次下载
今年自学的c语言,代码肯定有很多地方可以优化

请大家贴出测试结果


欢迎提出意见!
+47
科创币
20!Dopaminor
2013/01/13
蛋疼东西来了...  欢迎
+10
科创币
最高主机泡泡
2013/01/13
也学C语言,佩服一下,,,到现在还是头晕,明天就要考试了,,,郁闷,代码也看不懂了,,,
+25
科创币
孤独的酒精灯
2013/01/13
+50
科创币
phpskycn
2013/01/15
多SY,少YY
13年11个月前IP:未同步
487844
1楼
第十八行第三十一行为什么要用条件空置的for语句呢?直接用if不是更省事吗?还省了个break。。。
我也是初学,有错误尽管指出啊,,,也许有什么特殊用途我没发现。。。
(这是用什么编译器编的?MinGW?还是VC++?反正我的VS2012写的C++程序都要一个msvcr110d.dll的运行库,是个debug库,且不在Vc2010运行库中,请问怎么能编译出不要调试库的程序?生成选项卡下的选项都试过了,都不管用,,,用dev-c++和MinGW命令行编译都没问题,可是很喜欢VS2012,感觉很方便,,有什么办法吗?)
+15
科创币
redeemer1001
2013/01/13
好了 折腾完LZ的程序 开始复习~
+1
科创币
novakon
2013/01/16
新建一个空的c++工程,然后在工程中新建一个cpp文件,编译试试。
引用
评论
13年11个月前IP:未同步
487878
2楼
回 1楼(baiwenglong) 的帖子
握手 同是明天考试 我上午9点考试 现在还没复习 [s:274]
+15
科创币
最高主机泡泡
2013/01/13
我们下午考啊啊啊啊。。。安慰,加分,,,
引用
评论
13年11个月前IP:未同步
487916
3楼
文件没有被正确关闭,所以还是删不掉 Untitled.png
引用
评论
13年11个月前IP:未同步
487918
4楼
LZ的程序最大问题是 fwrite写入的时候是写入到写入缓存的 应该用write代替(open\\close代替fopen\\fclose) 具体自行查这两个函数
除此之外
1 没有对输入字符进行核审(或者说不够严格) 随便输入两个以上字母就陷入死循环了
2 无法识别大写字母的盘符
3 if(diskname=='c') strcpy(filename, "c:disktest.test"); 这段写得太烂了!
4 if(fp=(fopen(filename,"wb"))==NULL) if的条件永远都是TRUE!注意括号的位置
至于无法删除 我估计是因为"c:disktest.test"这个根本不是正确的文件地址!正确是"c:\\disktest.test"(注意这里没有转义符,源代码要针对“\\”加上转义符变成“\\\\”)
正确地址用remove()函数轻松解决

我修改了LZ的程序修复完善了以上问题 修改处加入了注释

attachment icon 硬盘写速度测试器 修改By Redeemer1001.7z 41.30KB 7Z 18次下载
待完善的部分:
我在本机的西数笔记本硬盘上测得100M/s的速度,而金士顿 V200+ SSD上测得70M/s的速度 与正确成绩有较大出入
我觉得原因是写入的实现不够好 因为我不了解malloc而且我得复习了所以没处理 LZ加油~
PS:我花了1KCB下载LZ的程序 给我加回来哦~
+10
科创币
相对论万岁
2013/01/15
感谢,感谢! 自己都绝对那一段写得烂……
引用
评论
13年11个月前IP:未同步
488024
5楼
回 楼主(相对论万岁) 的帖子
BOOL DeleteFile(

     LPCTSTR lpFileName  // pointer to name of file to delete  
    );
int remove( const char *filename);
都可以删除,请仔细检查参数是否正确。
感觉要直接I/O操作才能测得真实的速度--
另外只需检查盘符的合法性即可,再自己生成目标位置。。。
引用
评论
13年11个月前IP:未同步
488465
6楼
那几个判断盘符的句子自己都感觉很烂……刚刚学C才几个月……
关键是如何检测盘符是否合法呢???
+1
科创币
redeemer1001
2013/01/15
其实更好的方法是检测所有的磁盘并列出盘符给用户选择
引用
评论
13年11个月前IP:未同步
488469
7楼
回 5楼(phpskycn) 的帖子
试过remove
删除失败……
记得貌似最初调试的时候,用system("del……");成功删除了……
后来一直出问题,
我想,如果写入部分专门成一个函数,最后用exit退出试试?……
主要的问题是:进程访问文件,所以无法删除(用360木马例外……)
最终试过用批处理结束“测试器”进程,但是仍然无法直接删掉,提示另一个进程正在访问……
不过在cmd里头键入del命令可以删除,不知道原因
至于有无\\,好像没有多大关系,因为文件在根目录,系统可以正常访问(xp可能会出错……)
我的这个程序写硬盘的时候,从任务管理器看,速度是用“撸大湿”的两倍……
至于I/O操作,影响应该不大,写盘的时候,电脑明显变卡,机械盘是这样,另一个程序读/写盘,必然会影响到结果
引用
评论
13年11个月前IP:未同步
488473
8楼
回 7楼(相对论万岁) 的帖子

DWORD WINAPI GetLogicalDriveStrings(
  _In_   DWORD nBufferLength,
  _Out_  LPTSTR lpBuffer
);

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(v=vs.85).aspx
通过该函数获取盘符列表

UINT WINAPI GetDriveType(
  _In_opt_  LPCTSTR lpRootPathName
);

再通过该函数检查磁盘类型,排除不一定可写的磁盘(软驱/光驱)
最后获取有效的盘符列表。
引用
评论
13年11个月前IP:未同步
488475
9楼
回 7楼(相对论万岁) 的帖子
建议不要过度依赖命令行
掌握Win API可以做更多事情……
I/O操作这个问题稍微复杂一点。Windows NT下用户模式的进程的中断请求级(IRQL)是最低的,很可能被内核代码打断,因而测得的结果存在很大的不确定性。
引用
评论
13年11个月前IP:未同步
488689
10楼
打开一个文件的时候,这个文件就被“占用”了,使用完之后必须在程序中将其“释放”。之前的内存测试程序也是一样的道理,测试完成之后释放内存。不释放内存看上去也还可以,关掉程序就自动释放了,但是如果一个人不关掉程序而重复多次运行,内存就会爆掉。

没有人生下来就会写程序的,我也是断断续续写了5 6 年程序才这个水平
引用
评论
13年11个月前IP:未同步
488693
11楼
回 1楼(baiwenglong) 的帖子
在这里选择 多线程 或者 多线程调试
不要选择 多线程DLL


如果还是不行,再讨论。


afsasd.jpg
引用
评论
13年11个月前IP:未同步
488758
12楼
回 10楼(novakon) 的帖子
这个我也知道,关键是如何释放?
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的