检测硬盘信息,扫描硬盘坏道——WinForm

前一阵子在弄一个硬盘检测程序,在网上搜索过,不是资料不全就是含糊其词。今天有幸能在上面说说,不足之处还希望大家多多指教。

本人也是通过网络资源搜索到相关资料,今天整理了发到网上。(如果对此有什么建议可以Email给我!)

 

首先准备工作,导入必须的命名空间:

1  using  System.Diagnostics;
2  using  System.IO;
3  using  System.Threading;
4  using  System.Management;

 

然后在窗体Form_Load编写代码:

 

1  Form5 frm  =   new  Form5(); // 声明检测窗体
2  private   void  Form4_Load( object  sender, EventArgs e)
3  {
4     System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls  =   false ; // 是否调用错误线程
5     frm.EventHand  +=   new  EventHandler(SetScanInfo); // 为测试窗体添加事件
6     GetDskInfo();                                   // 获取硬盘大小等信息
7     GetDskWd();                                     // 获取硬盘温度
8     comboBoxEx1.SelectedIndex  =   0 ;
9  }

 

 

下面将依次贴出Form_Load中所调用方法:
获取硬盘分区信息
       private   void  GetDskInfo()
        {
            SelectQuery selectQuery 
=   new  SelectQuery( " select * from win32_logicaldisk " );
            ManagementObjectSearcher searcher 
=   new  ManagementObjectSearcher(selectQuery);
            
foreach  (ManagementObject disk  in  searcher.Get())
            {
                
// 获取驱动器盘符
                 if  (disk[ " DriveType " ].ToString().Equals( " 3 " ))
                {
                    ComboBoxItem newItem 
=   new  ComboBoxItem();
                    newItem.Text 
=  disk[ " VolumeName " ].ToString()  +   " ( "   +  disk[ " Name " ].ToString()  +   " ) "   +   "     [ "   +  GetSizeUseUnit(disk[ " Size " ].ToString())  +   " ] " ;
                    newItem.Value 
=  disk[ " Name " ].ToString();
                    comboBoxEx1.Items.Add(newItem);
                }
            }
        }

 

硬盘大小格式化
       private   string  GetSizeUseUnit( string  size)
        {
            
double  dSpace  =  Convert.ToDouble(size);
            
string  sSpace  =  dSpace.ToString( " N " );
            
string [] tmp;
            
string  rtnSize  =   " 0 " ;
            tmp 
=  sSpace.Split( ' , ' );
            
switch  (tmp.GetUpperBound( 0 ))
            {
                
case   0 :
                    rtnSize 
=  tmp[ 0 +   "  字节 " ;
                    
break ;
                
case   1 :
                    rtnSize 
=  tmp[ 0 +   " . "   +  tmp[ 1 ].Substring( 0 2 +   "  K " ;
                    
break ;
                
case   2 :
                    rtnSize 
=  tmp[ 0 +   " . "   +  tmp[ 1 ].Substring( 0 2 +   "  M " ;
                    
break ;
                
case   3 :
                    rtnSize 
=  tmp[ 0 +   " . "   +  tmp[ 1 ].Substring( 0 2 +   "  G " ;
                    
break ;
                
case   4 :
                    rtnSize 
=  tmp[ 0 +   " . "   +  tmp[ 1 ].Substring( 0 2 +   "  T " ;
                    
break ;
            }
            
return  rtnSize;
        }

 

获取硬盘温度
       private   string  GetTemp()
        {
            
try
            {
                
string  temperatur  =  String.Empty;
                
string  gesamt  =  String.Empty;

                ManagementObjectSearcher searcher 
=   new  ManagementObjectSearcher( " root\\WMI " " SELECT * FROM MSStorageDriver_ATAPISmartData " );
                ManagementObjectSearcher logicDisk 
=   new  ManagementObjectSearcher( " SELECT * FROM Win32_DiskDrive " );

                
foreach  (ManagementObject queryObjDisk  in  logicDisk.Get())
                {
                    
string  DiskName  =  Convert.ToString(queryObjDisk[ " Model " ]);

                    
foreach  (ManagementObject queryObj  in  searcher.Get())
                    {
                        Byte[] arrVendorSpecific 
=  (Byte[])(queryObj[ " VendorSpecific " ]);

                        
if  (DiskName.IndexOf( " Maxtor " >=   0 ) // 迈拓硬盘
                        {
                            temperatur 
=  Convert.ToString(arrVendorSpecific[ 151 ]);
                            gesamt 
=  DiskName  +   "   "   +  temperatur  +   " °C " ;
                            
break ;
                        }
                        
else
                        {
                            
if  ((DiskName.IndexOf( " Western Digital " >=   0 ||  (DiskName.IndexOf( " WesternDigital " >=   0 ||  (DiskName.IndexOf( " WD " >=   0 )) // 西部数据
                            {
                                temperatur 
=  Convert.ToString(arrVendorSpecific[ 139 ]);
                                gesamt 
=  DiskName  +   "   "   +  temperatur  +   " °C " ;
                                
break ;
                            }
                            
else   if  ((DiskName.IndexOf( " Seagate " >=   0 ||  (DiskName.IndexOf( " ST " >=   0 ||  (DiskName.IndexOf( " Seagate Technology " >=   0 )) // 希捷
                            {
                                temperatur 
=  Convert.ToString(arrVendorSpecific[ 127 ]);
                                gesamt 
=  DiskName  +   "   "   +  temperatur  +   " °C " ;
                                
break ;
                            }
                            
else   if  ((DiskName.IndexOf( " FT " >=   0 ||  (DiskName.IndexOf( " FUJITSU " >=   0 )) // 富士通硬盘
                            {
                                temperatur 
=  Convert.ToString(arrVendorSpecific[ 151 ]);
                                gesamt 
=  DiskName  +   "   "   +  temperatur  +   " °C " ;
                                
break ;
                            }
                        }

                    }
                }

                
return  gesamt;
            }
            
catch  (ManagementException err)
            {
                
return  err.Message;
            }
        }

 

ComboBox处理类
    public   class  ComboBoxItem
    {
        
private   string  _text  =   null ;
        
private   object  _value  =   null ;
        
public   string  Text {  get  {  return   this ._text; }  set  {  this ._text  =  value; } }
        
public   object  Value {  get  {  return   this ._value; }  set  {  this ._value  =  value; } }
        
public   override   string  ToString()
        {
            
return   this ._text;
        }
    }

 

检测画面所调用方法
        void  SetScanInfo( object  sender, EventArgs e)
        {
            frm 
=  (Form5)sender;
            
if  ( null   !=  frm.EventHand)
            {
                textBoxX1.Text 
+=  frm.Content  +   " \r\n " ;
            }

            
this .Focus();
        }

 


到此获取硬盘信息所有重要方法都已贴出,下面将贴出硬盘扫描画面代码:
在检测画面中所需要引用的命名空间:
1  using  System.Threading;
2  using  System.Diagnostics;
3  using  System.IO;

 

测试窗体中代码
 Thread mythread;

        
private   void  timer1_Tick( object  sender, EventArgs e)
        {
            
if  ( this .progressBarX1.Value  <   100 )
            {
                
this .progressBarX1.PerformStep();
            }
            
else
            {
                
this .progressBarX1.Value  =   0 ;
                
this .label1.Text  =  ( int .Parse( this .label1.Text)  +   1 ).ToString();
            }

        }

        
private   void  Form5_Load( object  sender, EventArgs e)
        {
            
this .progressBarX1.Capture  =   false ;
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls 
=   false ;
            mythread 
=   new  Thread( new  ThreadStart(WriteData));
            mythread.Start();
        }

        
private   void  WriteData()
        {
            
try
            {
                ProcessStartInfo start 
=   new  ProcessStartInfo( " cmd.exe " ); // 设置运行的命令行文件问ping.exe文件,这个文件系统会自己找到
                
// 如果是其它exe文件,则有可能需要指定详细路径,如运行winRar.exe
                start.Arguments  =   " /c chkdsk  "   +  Ml; // 设置命令参数
                start.CreateNoWindow  =   true ; // 不显示dos命令行窗口
                start.RedirectStandardOutput  =   true ; //
                start.RedirectStandardInput  =   true ; //
                start.UseShellExecute  =   false ; // 是否指定操作系统外壳进程启动程序
                Process p  =  Process.Start(start);
                StreamReader reader 
=  p.StandardOutput; // 截取输出流
                 string  line  =  reader.ReadLine(); // 每次读取一行
                 while  ( ! reader.EndOfStream)
                {
                    line 
=  reader.ReadLine();
                    Content 
=  line  +   "   " ;
                    
if  ( null   !=  EventHand)
                    {
                        
try
                        {
                            EventHand(
this , EventArgs.Empty);
                        }
                        
catch
                        {
                            EventHand(
this , EventArgs.Empty);
                        }
                    }
                }
                p.WaitForExit();
// 等待程序执行完退出进程
                p.Close(); // 关闭进程
                reader.Close(); // 关闭流

                
if  (mythread.IsAlive)
                {
                    mythread.Abort();
                }
            }
            
catch
            {
                
this .Close();
                mythread.Abort();
            }
        }

        
private   string  m_content  =  String.Empty;
        
private  EventHandler m_eventHand;
        
private   string  m_ml  =  String.Empty;

        
public   string  Ml
        {
            
get  {  return  m_ml; }
            
set  { m_ml  =  value; }
        }

        
public  EventHandler EventHand
        {
            
get  {  return  m_eventHand; }
            
set  { m_eventHand  =  value; }
        }

        
public   string  Content
        {
            
get  {  return  m_content; }
            
set  { m_content  =  value; }
        }

 

 

 

最后按F5运行,效果画面如下

                                                效果图(—)

点击检测按钮后:

检测硬盘信息,扫描硬盘坏道——WinForm_第1张图片

                                          效果图(二)

 

好了到此就算完成,希望对您有所帮助。

你可能感兴趣的:(WinForm)