由于在做开发的时候在本地找各种格式的图片素材的时候,总是在一堆文件夹中乱翻,导致很不爽的样子,所以想做一个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;
}
}
这样估计直接贴过去编译就不会不过了。