using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading;
using System.ComponentModel;
using System.IO;
namespace MemInfo
{
public delegate void MemoryRefreshEventHandler(object sender, EventArgs e);
public class MemoryStatistic
{
#region events
public event MemoryRefreshEventHandler MemoryRefresh;
#endregion //events
#region members
private MemoryInfo deviceRam;
private StoreInfo deviceRom;
private CardsInfo deviceCards;
private Timer timer;
#endregion //members
#region constructors
public MemoryStatistic()
{
this.deviceRam = new MemoryInfo();
this.deviceRom = new StoreInfo(@"\");
this.deviceCards = new CardsInfo();
this.timer = new Timer(new TimerCallback(this.UpdateStat), null, System.Threading.Timeout.Infinite, 0);
}
#endregion //constructors
#region private methods
private void GetStatistic()
{
this.deviceRam.UpdateInfo();
this.deviceRom.UpdateInfo();
this.deviceCards.UpdateInfo();
}
private bool NeedUpdate()
{
if (this.deviceRam.NeedUpdate() || this.deviceRom.NeedUpdate()||this.deviceCards.NeedUpdate())
{
return true;
}
return false;
}
private void UpdateStat(object sender)
{
if (this.NeedUpdate())
{
this.GetStatistic();
if (MemoryRefresh != null)
{
MemoryRefresh(this, EventArgs.Empty);
}
}
}
#endregion //private methods
#region public methods
public void Initialize(long tick)
{
//this.UpdateStat(null);
this.timer.Change(0,tick);
}
#endregion //public methods
#region properties
public long MemoryUsage { get { return (int)this.deviceRam.MemoryUsage; }}
public long VirtualTotal { get { return (long)this.deviceRam.VirtualTotal; }}
public long VirtualFree { get { return (long)this.deviceRam.VirtualFree; }}
public long VirtualUsed { get { return (long)this.deviceRam.VirtualUsed; }}
public long ProgramTotal { get { return (long)this.deviceRam.ProgramTotal; }}
public long ProgramFree { get { return (long)this.deviceRam.ProgramFree; }}
public long ProgramUsed { get { return (long)this.deviceRam.ProgramUsed; }}
public long StorageTotal { get { return (long)this.deviceRom.StorageTotal; }}
public long StorageFree { get { return (long)this.deviceRom.StorageFree; }}
public long StorageUsed { get { return (long)this.deviceRom.StorageUsed; }}
public List<StoreInfo> CardList { get { return this.deviceCards.CardList; } }
#endregion //properties
}
public class MemoryInfo
{
#region DLL import
[DllImport("coredll", SetLastError = false)]
private static extern void GlobalMemoryStatus(out MemoryStatus status);
#endregion //DLL import
private struct MemoryStatus
{
internal uint dwLength;
public int memoryLoad;
public int totalPhysical;
public int availablePhysical;
public int totalPageFile;
public int availablePageFile;
public int totalVirtual;
public int availableVirtual;
}
private MemoryStatus deviceRam;
public bool NeedUpdate()
{
MemoryStatus devRam = new MemoryStatus();
GlobalMemoryStatus(out devRam);
if (devRam.Equals(this.deviceRam))
{
return false;
}
return true;
}
public void UpdateInfo()
{
GlobalMemoryStatus(out this.deviceRam);
}
public MemoryInfo()
{
this.deviceRam = new MemoryStatus();
this.UpdateInfo();
}
public long MemoryUsage { get { return (int)this.deviceRam.memoryLoad; } }
public long VirtualTotal { get { return (long)this.deviceRam.totalVirtual; } }
public long VirtualFree { get { return (long)this.deviceRam.availableVirtual; } }
public long VirtualUsed { get { return (long)(deviceRam.totalVirtual - deviceRam.availableVirtual); } }
public long ProgramTotal { get { return (long)this.deviceRam.totalPhysical; } }
public long ProgramFree { get { return (long)this.deviceRam.availablePhysical; } }
public long ProgramUsed { get { return (long)(deviceRam.totalPhysical - deviceRam.availablePhysical); } }
}
public class StoreInfo
{
#region DLL import
[DllImport("coredll", SetLastError = false)]
internal static extern bool GetDiskFreeSpaceEx(
string rootDirName,
out long freeBytesAvailable,
out long totalNumberOfBytes,
out long totalNumberOfFreeBytes);
#endregion //DLL import
private struct StoreStatus
{
public long storeAviable;
public long storeTotal;
public long storeFree;
}
private string storePath;
private StoreStatus deviceRom;
private StoreStatus GetStoreStatus()
{
StoreStatus devRom = new StoreStatus();
if (!GetDiskFreeSpaceEx(this.storePath, out devRom.storeAviable,
out devRom.storeTotal, out devRom.storeFree))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
return devRom;
}
public bool NeedUpdate()
{
StoreStatus devRom = new StoreStatus();
devRom = GetStoreStatus();
if (devRom.Equals(this.deviceRom))
{
return false;
}
return true;
}
public void UpdateInfo()
{
this.deviceRom = GetStoreStatus();
}
public StoreInfo(string path)
{
this.deviceRom = new StoreStatus();
this.storePath = path;
this.UpdateInfo();
}
public string StorageFolder { get { return this.storePath; } }
public long StorageTotal { get { return (long)this.deviceRom.storeTotal; } }
public long StorageFree { get { return (long)this.deviceRom.storeFree; } }
public long StorageUsed { get { return (long)(this.deviceRom.storeTotal - this.deviceRom.storeFree); } }
}
public class CardsInfo {
private List<StoreInfo> deviceCards;
#region methods
private List<StoreInfo> GetCardsStatus()
{
List<StoreInfo> devCards = new List<StoreInfo>();
DirectoryInfo[] directoryList = new DirectoryInfo(@"\").GetDirectories();
for (int i = 0; i < directoryList.Length; ++i)
{
if ((directoryList[i].Attributes & FileAttributes.Temporary) != 0)
{
devCards.Add(new StoreInfo(directoryList[i].Name));
}
}
return devCards;
}
public bool NeedUpdate()
{
List<StoreInfo> devCards = new List<StoreInfo>();
devCards = GetCardsStatus();
for (int i = 0; i < devCards.Count;i++)
{
if (//devCards.Equals(this.deviceCards)
(devCards.ElementAt(i).StorageFolder != this.deviceCards.ElementAt(i).StorageFolder) ||
(devCards.ElementAt(i).StorageFree != this.deviceCards.ElementAt(i).StorageFree) ||
(devCards.ElementAt(i).StorageUsed != this.deviceCards.ElementAt(i).StorageUsed) ||
(devCards.ElementAt(i).StorageTotal != this.deviceCards.ElementAt(i).StorageTotal)
)
{
return true;
}
}
return false;
}
public void UpdateInfo()
{
this.deviceCards = GetCardsStatus();
}
#endregion //methods
public CardsInfo()
{
deviceCards = new List<StoreInfo>();
this.UpdateInfo();
}
public List<StoreInfo> CardList { get { return this.deviceCards; } }
}
}