如何在C#下获得磁盘信息

由于在做开发的时候在本地找各种格式的图片素材的时候,总是在一堆文件夹中乱翻,导致很不爽的样子,所以想做一个ImageViewer,可以把不同文件夹的Image综合在一起,并且可以放大预览,可以分类的一个小工具。在开发的时候遇到一些WMI编程的问题,即如何取得电脑上相关磁盘的信息。

下面将要贴的代码是一个WPF的代码,我写的比较烂,也没用什么MVVM的一些框架比如MVVMLight之类,so大家看重点就好了,我都贴出来是位了怕有些同学直接复制运行不通过。

所以第一段第二段是重点,大家可以忽略LocalDriveModel这个东西,只看如果取到的就可以了

代码记录如下

第一段:

        public static ObservableCollection<LocalDriveModel> GetLogicalDrives()
        {
            ObservableCollection<LocalDriveModel> ocLocalDriveModels = new ObservableCollection<LocalDriveModel>();

            SelectQuery sq = new SelectQuery("select * from win32_logicaldisk");
            ManagementObjectSearcher mos = new ManagementObjectSearcher(sq);

            foreach (System.Management.ManagementObject disk in mos.Get())
            {
                if (disk["Size"] != null)
                {
                    //剔除掉disk大小为0或者不可访问的disk
                    LocalDriveModel localDriveMdoel = new LocalDriveModel();

                    localDriveMdoel.DriveType = (DriveType)int.Parse(disk["DriveType"].ToString());

                    GetLocaldriveInfo(disk, ref localDriveMdoel);

                    //卷序列号为disk["VolumeSerialNumber"].ToString()

                    ocLocalDriveModels.Add(localDriveMdoel);
                }
            }

            return ocLocalDriveModels;
        }

在这里面用到一个LocalDriveModel和GetLocaldriveInfo方法,

第二段:GetLocalDriveInfo方法如下

        private static void GetLocaldriveInfo(ManagementObject disk, ref LocalDriveModel localDriveMdoel)
        {
            localDriveMdoel.DriveSignal = disk["Name"] != null ? disk["Name"].ToString() : string.Empty;
            localDriveMdoel.DriveName = disk["VolumeName"] != null ? disk["VolumeName"].ToString() : string.Empty;

            decimal outTemp1;
            decimal outTemp2;
            localDriveMdoel.DriveTotalSize = disk["Size"] != null ? (decimal.TryParse(disk["Size"].ToString(), out outTemp1) ? outTemp1 : 0) : 0;
            localDriveMdoel.DriveAvailableSize = disk["FreeSpace"] != null ? (decimal.TryParse(disk["FreeSpace"].ToString(), out outTemp2)
                ? outTemp2 : 0) : 0;
            localDriveMdoel.DriveUsedSize = localDriveMdoel.DriveTotalSize - localDriveMdoel.DriveAvailableSize;
            //localDriveMdoel.OcSubFolders = GetSubFolders(localDriveMdoel.DriveSignal + "\\");
            //localDriveMdoel.FolderCount = localDriveMdoel.OcSubFolders.Count.ToString();
            //localDriveMdoel.FileCount = GetFileCount(localDriveMdoel.DriveSignal + "\\");
        }

这里面我屏蔽了三行代码,

	    //localDriveMdoel.OcSubFolders = GetSubFolders(localDriveMdoel.DriveSignal + "\\");
            //localDriveMdoel.FolderCount = localDriveMdoel.OcSubFolders.Count.ToString();
            //localDriveMdoel.FileCount = GetFileCount(localDriveMdoel.DriveSignal + "\\");

这里是取得folder的一些信息,这个比较简单就不贴里面的代码了

LocalDriveModel类代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.IO;

namespace FolderSizeFinder.Models
{
    public class LocalDriveModel : BaseModel
    {
        public LocalDriveModel()
        {
            this.OcSubFolders.CollectionChanged += (s, e) =>
                {
                    ChangeProperty("OcSubFolders");
                };
        }

        private string driveName;

        /// <summary>
        /// 磁盘卷名称
        /// </summary>
        public string DriveName
        {
            get
            {
                return driveName;
            }

            set
            {
                driveName = value;
                ChangeProperty("DriveName");
            }
        }

        private DriveType driveType;

        /// <summary>
        /// 磁盘类型
        /// </summary>
        public DriveType DriveType
        {
            get
            {
                return driveType;
            }

            set
            {
                driveType = value;
                ChangeProperty("DriveType");
            }
        }

        private string driveSignal;

        /// <summary>
        /// 磁盘盘符
        /// </summary>
        public string DriveSignal
        {
            get
            {
                return driveSignal;
            }

            set
            {
                driveSignal = value;
                ChangeProperty("DriveSignal");
            }
        }

        private decimal driveTotalSize;

        /// <summary>
        /// 驱动器总大小
        /// </summary>
        public decimal DriveTotalSize
        {
            get
            {
                return driveTotalSize;
            }

            set
            {
                driveTotalSize = value;
                ChangeProperty("DriveTotalSize");
                ChangeProperty("Usage");
            }
        }

        private decimal driveUsedSize;

        /// <summary>
        /// 驱动器已用大小
        /// </summary>
        public decimal DriveUsedSize
        {
            get
            {
                return driveUsedSize;
            }

            set
            {
                driveUsedSize = value;
                ChangeProperty("DriveUsedSize");
            }
        }

        private decimal driveAvailableSize;

        public decimal DriveAvailableSize
        {
            get
            {
                return driveAvailableSize;
            }

            set
            {
                driveAvailableSize = value;
                ChangeProperty("DriveAvailableSize");
                ChangeProperty("Usage");
            }
        }

        private string folderCount;
        /// <summary>
        /// 文件夹个数
        /// </summary>
        public string FolderCount
        {
            get
            {
                return folderCount;
            }

            set
            {
                folderCount = value;
                ChangeProperty("FolderCount");
            }
        }

        private int fileCount;

        public int FileCount
        {
            get { return fileCount; }
            set
            {
                fileCount = value;
                ChangeProperty("FileCount");
            }
        }

        private decimal usage;

        public decimal Usage
        {
            get { return DriveAvailableSize == null ? 0 : DriveTotalSize == null | DriveTotalSize == 0 ? 0 : DriveAvailableSize / DriveTotalSize; }
        }


        private ObservableCollection<FolderModel> ocSubFolders = new ObservableCollection<FolderModel>();
        /// <summary>
        /// 子文件夹集合
        /// </summary>
        public ObservableCollection<FolderModel> OcSubFolders
        {
            get
            {
                return ocSubFolders;
            }

            set
            {
                ocSubFolders = value;
                ChangeProperty("OcSubFolders");
            }
        }
    }
}


我去,我发现又有一个调用,BaseModel,尼玛我写的代码真烂。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace FolderSizeFinder.Models
{
    public class BaseModel : INotifyPropertyChanged
    {
        protected void ChangeProperty(string propName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged.Invoke(new object(), new PropertyChangedEventArgs(propName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}


这样估计直接贴过去编译就不会不过了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值