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

cak*_*rus 4 c#

这是C#/.NET 2.0.

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

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

Console.Out.WriteLine("Size: " + data.Length/1024 + "KB");
Run Code Online (Sandbox Code Playgroud)

Console.Out.WriteLine("Size: " + (data.Length * sizeof(char))/1024 + "KB");
Run Code Online (Sandbox Code Playgroud)

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

XML序列化:

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

写入文件系统(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();
Run Code Online (Sandbox Code Playgroud)

谢谢

Kev*_*son 10

你错过了编码过程的工作原理.试试这个:

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

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

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