基本上,我正在创建一个复制应用程序,我只需要计算出数据库大小以及 D:\ 驱动器上有多少可用空间。
如果数据库大小大于可用空间,那么我需要提醒用户。
这是我到目前为止所拥有的:
首先查看D盘还有多少可用空间。
DriveInfo di = new DriveInfo(@"D:\");
if (di.IsReady)
{
freeSpace = di.TotalFreeSpace;
}
然后我得到我要复制的数据库的大小:
dbSize = Database.GetDatabaseSize(ddlPublisherServer.Text, ddlPublisherDatabase.Text);
这是获取数据库大小的方法。我不知道是否有更好的方法来做到这一点,但大小带有“MB”字符串,所以我需要删除它。
public static long GetDatabaseSize(string server, string database)
{
string finalConnString = Properties.Settings.Default.rawConnectionString.Replace("<<DATA_SOURCE>>", server).Replace("<<INITIAL_CATALOG>>", database);
using (SqlConnection conn = new SqlConnection(finalConnString))
{
using (SqlCommand cmd = new SqlCommand("sp_spaceused", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
cmd.ExecuteNonQuery();
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
using (DataSet ds = new DataSet())
{
da.Fill(ds);
var spaceAvailable = ds.Tables[0].Rows[0][1].ToString();
string freeSpace = spaceAvailable.Remove(spaceAvailable.Length - 3, 3);
return Convert.ToInt64(freeSpace);
}
}
}
}
}
我现在的问题是 -
如何将字节转换为兆字节,以便比较数据库大小和磁盘可用空间?
这就是我所拥有的,但它是兆字节和字节,所以我需要在这里进行转换。
if (dbSize > freeSpace)
{
ClientScript.RegisterStartupScript(this.GetType(), "Insufficient Space", "alert('The database size is greater than the available space on the drive. Please make some room for the database in D drive of the subscriber server.');", true);
}
字节换算为兆字节 =
Bytes / (1024 * 1024)
Megabytes * (1024 * 1024.0)
请务必考虑整数除法,因此
1024.0
因此使用浮点数。
1 KB 为 1024 个字节,1 MB 为 1024 KB。因此,将兆字节乘以 1024 * 1024(以获得字节)。或者将字节除以 1024 * 1024(得到兆字节)。
我在这里从用户NeverHopeless找到了一个很好的答案,并调整了代码以遵循IEC标准,例如omar的ByteSize NuGet:
public static class SizeExtension
{
public enum MetricUnits
{
Byte, kB, MB, GB, TB, PB, EB, ZB, YB, RB, QB
}
public enum BinaryUnits
{
Byte, KiB, MiB, GiB, TiB, PiB, EiB, ZiB, YiB
}
public static string ToSize(this Int64 value, MetricUnits sourceUnit, MetricUnits targetUnit)
{
return (value / (double)Math.Pow(1000, (Int64)(targetUnit - sourceUnit))).ToString("0.00");
}
public static string ToSize(this Int64 value, BinaryUnits sourceUnit, BinaryUnits targetUnit)
{
return (value / (double)Math.Pow(1024, (Int64)(targetUnit - sourceUnit))).ToString("0.00");
}
}
现在你可以做这样的事情:
// Bytes to MegaBytes:
var sizeInMB = sizeInBytes.ToSize(SizeExtension.MetricUnits.Byte, SizeExtension.MetricUnits.MB);
// MegaBytes to Bytes:
var sizeInBytes = sizeInMB.ToSize(SizeExtension.MetricUnits.MB, SizeExtension.MetricUnits.Bytes);