在数据仍在内存中时确定将来文件的大小

时间:2009-05-05 17:10:19

标签: c#

这是C#/。NET 2.0。

所以我的字符串包含XML文件的未来内容。它包含来自图像文件的元数据和二进制数据。一旦我将字符串中的数据写入文件系统,我想以某种方式确定XML文件的大小。

我尝试了以下内容并且都不起作用:

Console.Out.WriteLine("Size: " + data.Length/1024 + "KB");

Console.Out.WriteLine("Size: " + (data.Length * sizeof(char))/1024 + "KB");

两者都不起作用(生成的文件的实际大小与这些方法中的任何一个返回的大小不同)。我显然在这里遗漏了一些东西。任何帮助将不胜感激。

XML序列化:

// doc is an XMLDocument that I've built previously
StringWriter sw = new StringWriter();
doc.Save(sw);
string XMLAsString = sw.ToString();

写入文件系统(XMLAsString作为变量命名数据传递给此函数):

Random rnd = new Random(DateTime.Now.Millisecond);      
FileStream fs = File.Open(@"C:\testout" + rnd.Next(1000).ToString() +  ".txt", FileMode.OpenOrCreate);
StreamWriter sw = new StreamWriter(fs);
app.Diagnostics.Write("Size of XML: " + (data.Length * sizeof(char))/1024 + "KB");
sw.Write(data);
sw.Close();
fs.Close();

由于

5 个答案:

答案 0 :(得分:9)

您错过了编码过程的工作原理。试试这个:

string data = "this is what I'm writing";
byte[] mybytes = System.Text.Encoding.UTF8.GetBytes(data);

如果以一种“正常”的方式写入数组,则数组的大小正是它应该在磁盘上占用的字节数,因为UTF8是文本输出的默认编码(我认为)。可能会写一个额外的EOF(文件结束)字符,但你应该非常接近。

编辑:我认为值得每个人都记住C#/ .NET中的字符不是一个字节长,而是两个,并且是unicode字符,然后编码到任何输出格式需求。这就是为什么使用data.Length*sizeof(char)的任何方法都不起作用的原因。

答案 1 :(得分:1)

在NTFS中,如果文件系统设置为compress,则最终文件可能小于实际文件的大小。这是你的问题吗?

答案 2 :(得分:1)

如果要确定文件是否适合媒体,则必须考虑文件系统的分配大小。一个10字节长的文件不占用磁盘上的10个字节。空间要求以离散步骤增加,由分配大小(也称为簇大小)决定。

有关NTFS和FAT群集大小的详细信息,请参阅this Microsoft support article

答案 3 :(得分:0)

上面示例中的data是什么?如何在xml文件中表示二进制数据?

您很可能希望对字节数组进行完整序列化,以准确猜测大小。序列化程序可以执行任意操作,例如添加CDATA标记,如果由于某种原因需要将文件保存为UTF-16而不是UTF-8,那么可能会将文件大小加倍。

答案 4 :(得分:0)

您可以将其保存(或写入)到内存流,然后确定内存流的大小,这是确定实际大小而不将其写入磁盘的唯一方法。

看不出有任何意义,您可以将其保存为本地文件,查看最终文件大小,然后选择如何处理它。

如果您只想添加一堆编码的二进制元素,并且我们可以假设其余的XML与之相比可以忽略不计,那么您想要做的就是合理估计XML文件的大小。编码的二进制内容,然后是确定由于编码引入的膨胀的问题。

典型地,我们将使用base64编码对二进制内容进行编码,这导致每3字节二进制4个字节的ASCII,即33%的膨胀。因此,估计将是data.Length * 1.33333