【分享】采用CMD/WMI獲取共享文件夾——及2種方式的性能對比


  之前在網上看到有朋友寫了篇關於“如何用C#獲取本地計算機共享文件夾”的文章,看了下代碼用的是WMI方式,也就是調用System.Management中的類和方法,來獲取計算機共享文件夾。我記得自己幾年前有個項目需要獲取硬件信息,當時用的也是WMI方式,留給自己的印象是WMI挺慢的。所以就動手寫了個測試,發現WMI方式獲取共享文件夾其時並不慢,也許只是獲取某些特定硬件信息時才慢吧。

 

  我寫的測試示例,包含兩個測試,一種是用CMD方式,另一種是WMI方式,我的測試結果是CMD比WMI方式要慢一些,畢竟啟動線程是要花時間的。其中WMI方式大家應該都懂,CMD方式是使用C#調用cmd.exe並接收命令行所返回的信息,如果需要做PING或調用控件台命令時,可能會用到,所以一起分享給大家吧。

  

  示例我是采用自己開發的EasyCode.Net來設計和生成的,關於EasyCode.Net代碼生成器可以參見:

  http://www.cnblogs.com/BudEasyCode/archive/2012/02/27/2370549.html

 

  本示例的相關界面截圖及代碼如下:

 

 

 

相關獲取共享文件夾的代碼:

using System;
using System.Diagnostics;
using System.Management;
using System.Collections.Generic;
using System.Text;

namespace BudStudio.NetShare.SFL
{
    public class NetShareHelper
    {
        /// <summary>
        /// WMI方式獲取共享文件夾
        /// </summary>
        public static string GetNetShareByWMI()
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            ManagementObjectSearcher searcher = new ManagementObjectSearcher("select  *  from  win32_share");
            string shareFolders = "";
            foreach (ManagementObject share in searcher.Get())
            {
                try
                {
                    shareFolders += share["Name"].ToString();
                    shareFolders += " - ";
                    shareFolders += share["Path"].ToString();
                    shareFolders += "\r\n";
                }
                catch (Exception ex)
                {
                    throw new CustomException(ex.Message, ExceptionType.Warn);
                }

            }

            stopwatch.Stop();
            shareFolders += "總計用時:" + stopwatch.ElapsedMilliseconds.ToString() + "毫秒";
            return shareFolders;
        }

        /// <summary>
        /// CMD方式獲取共享文件夾
        /// </summary>
        /// <param name="targetMachine">目標主機IP或名稱</param>
        public static string GetNetShareByCMD(string targetMachine)
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            string shareFolders = "";
            try
            {
                shareFolders = Cmd("Net View \\\\" + targetMachine);
            }
            catch (Exception ex)
            {
                throw new CustomException(ex.Message, ExceptionType.Warn);
            }

            stopwatch.Stop();
            shareFolders += "總計用時:" + stopwatch.ElapsedMilliseconds.ToString() + "毫秒";
            return shareFolders;
        }

        private static string Cmd(string cmd)
        {
            Process p = new Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            p.StandardInput.AutoFlush = true;

            p.StandardInput.WriteLine(cmd);

            p.StandardInput.WriteLine("exit");
            string strRst = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
            p.Close();
            return strRst;
        }


    }
}

 

本示例中的源代碼下載:http://files.cnblogs.com/BudEasyCode/NetShare.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM