2010-08-11 169 views
2

因此,在我的程序中,我使用COM Auotmation(Silverlight 4中的AutomationFactory)创建一个FileSystemObject,向其中写入一个字符串(theContent)。这种情况下的内容是一个小的UTF-8 XML文件,我使用MemoryStream将其序列化为字符串。Scripting.FileSystemObject写入方法失败

字符串很好,但由于某种原因,每当我调用FileSystemObject的Write方法时,我都会收到错误“HRESULT 0x800A0005(来自google的CTL_E_ILLEGALFUNCTIONCALL)。”最奇怪的部分是,如果我传递另一个简单的字符串,如“你好”,它没有问题。

任何想法?另外,如果有一种方法可以用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(); 
} 
+0

我只想问... *为什么*您使用FSO在这里? – 2010-08-11 19:28:01

+0

本质上,我使用Silverlight(用于.NET应用程序的OOB Silverlight前端)做了一些非常有趣的事情,所以我仅限于AutomationFactory可以生成的任何内容。 – 2010-08-11 19:46:18

回答

3

我用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(); 
    } 
} 
0

为什么不干脆:

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

甚至

​​
+0

Silverlight应用程序没有足够的权限。 – 2010-08-11 19:46:56