バイトの配列があり、これらのバイトをファイルに書き込む場合のファイルサイズを計算したいと思います。ファイルをディスクに書き込まずに可能ですか?
質問する
82098 次
4 に答える
104
どうarray.Length
ですか?バイト単位のサイズのように見えます。
于 2012-12-02T12:59:25.287 に答える
57
ええと、はい:
int length = byteArray.Length;
メモリ内のバイトはディスク上のバイトになります...少なくとも高レベルのファイルシステム用語では。また、使用される個々のブロック/クラスターの数(およびディレクトリエントリのオーバーヘッド)、およびオペレーティングシステムが提供する可能性のある圧縮についても考慮する必要がありますが、それが目的であるかどうかは質問からは明らかではありません。
ファイルサイズではなく「ディスク上のサイズ」を本当に知りたい場合(Windowsが2つの数値を表示できるのと同じ方法で)、本当にディスクに書き込む必要があると思います。次に、Win32を使用します。ディスク上の実際のサイズを見つけるためのAPI。
于 2012-12-02T12:59:56.397 に答える
7
Array.Length
合計サイズはバイトで表されます。
クラスターのサイズを考慮すると、ディスク上の物理的なサイズはもう少し大きくなる可能性があります。
于 2012-12-02T13:00:04.037 に答える
2
しばらく前に私はこれが切り取られているのを見つけました、そしてそれ以来私はこれをするのが好きです
public static string GetSizeInMemory(this long bytesize)
{
string[] sizes = { "B", "KB", "MB", "GB", "TB" };
double len = Convert.ToDouble(bytesize);
int order = 0;
while(len >= 1024D && order < sizes.Length - 1)
{
order++;
len /= 1024;
}
return string.Format(CultureInfo.CurrentCulture,"{0:0.##} {1}", len, sizes[order]);
}
この拡張メソッドは、FileInfoやProcessなどのファイルまたはメモリサイズを提供するものにアクセスするときに使用できます。以下は2つのサンプルです。
private void ValidateResources(object _)
{
Process p = Process.GetCurrentProcess();
double now = p.TotalProcessorTime.TotalMilliseconds;
double cpuUsage = (now - processorTime) / MONITOR_INTERVAL;
processorTime = now;
ThreadPool.GetMaxThreads(out int maxThreads, out int _);
ThreadPool.GetAvailableThreads(out int availThreads, out int _);
int cpuQueue = maxThreads - availThreads;
var displayString= string.Concat(
p.WorkingSet64.GetSizeInMemory() + "/"
, p.PeakWorkingSet64.GetSizeInMemory(), " RAM, "
, p.Threads.Count, " threads, ", p.HandleCount.ToString("N0", CultureInfo.CurrentCulture)
, " handles, ", Math.Min(cpuUsage, 1).ToString("P2", CultureInfo.CurrentCulture)
, " CPU usage, ", cpuQueue, " CPU queue depth"
));
}
またはファイル付き
FileInfo file = new FileInfo(pathtoFile);
string displaySize= file.Length.GetSizeInMemory();
于 2019-12-21T09:42:42.130 に答える