2

因此,在我的程序中,我使用 COM Auotmation(Silverlight 4 中的 AutomationFactory)来创建一个 FileSystemObject,我在其中写入一个字符串(theContent)。本例中的 theContent 是一个小的 UTF-8 XML 文件,我使用 MemoryStream 将其序列化为字符串。

该字符串很好,但由于某种原因,每当我调用 FileSystemObject 的 Write 方法时,我都会收到错误“HRESULT 0x800A0005(来自 Google 的 CTL_E_ILLEGALFUNCTIONCALL)”。最奇怪的是,如果我传递另一个简单的字符串,比如“hello”,它就可以正常工作。

有任何想法吗?

或者,如果有一种方法可以使用 FileSystemObject 公开文件/文本流,我可以直接对其进行序列化,那也很好(我似乎在 VB 中找不到任何东西)。

提前致谢!

string theContent = System.Text.Encoding.UTF8.GetString(content, 0, content.Length);
string hello = "hello";

 using (dynamic fsoCom = AutomationFactory.CreateObject("Scripting.FileSystemObject"))
 {
      dynamic file = fsoCom.CreateTextFile("file.xml", true);
      file.Write(theContent);
      file.Write(hello);
      file.Close();
 }
4

2 回答 2

4

我今天使用 ADODB.Stream 而不是 Scripting.FileSystemObject 解决了同样的问题。

在 Silverlight 4 OOB 应用程序中(即使信任度较高),您无法访问位于“MyDocuments”和其他几个与用户相关的特殊文件夹之外的位置的文件。您必须使用解决方法“COM+ 自动化”。但是非常适用于文本文件的 Scripting.FileSystemObject 无法处理二进制文件。幸运的是,您也可以在那里使用 ADODB.Stream。这可以很好地处理二进制文件。这是我的代码,使用 Word 模板、.dotx 文件进行测试:

public static void WriteBinaryFile(string fileName, byte[] binary)
{
    const int adTypeBinary = 1;
    const int adSaveCreateOverWrite = 2;
    using (dynamic adoCom = AutomationFactory.CreateObject("ADODB.Stream"))
    {
        adoCom.Type = adTypeBinary;
        adoCom.Open();
        adoCom.Write(binary);
        adoCom.SaveToFile(fileName, adSaveCreateOverWrite);
    }
}

文件读取可以这样完成:

public static byte[] ReadBinaryFile(string fileName)
{
    const int adTypeBinary = 1;
    using (dynamic adoCom = AutomationFactory.CreateObject("ADODB.Stream"))
    {
        adoCom.Type = adTypeBinary;
        adoCom.Open();
        adoCom.LoadFromFile(fileName);
        return adoCom.Read();
    }
}
于 2011-02-26T16:12:02.523 回答
0

为什么不只是:

File.WriteAllText("file.xml", theContent, Encoding.UTF8);

甚至

File.WriteAllBytes("file.xml", content);
于 2010-08-11T19:29:45.343 回答