Scripting.FileSystemObject Метод записи завершается ошибкой - PullRequest
2 голосов
/ 11 августа 2010

Итак, в моей программе я использую COM Auotmation (AutomationFactory в Silverlight 4) для создания объекта FileSystemObject, в который я записываю строку (theContent). Содержимое в этом случае - это небольшой XML-файл UTF-8, который я сериализовал, используя MemoryStream в строку.

Строка в порядке, но по какой-то причине всякий раз, когда я вызываю метод записи FileSystemObject, я получаю сообщение об ошибке «HRESULT 0x800A0005 (CTL_E_ILLEGALFUNCTIONCALL from google)». Самое странное, что если я передаю еще одну простую строку, например «привет», она работает без проблем.

Есть идеи?

В качестве альтернативы, если есть способ представить файл / текстовый поток с 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();
 }

Ответы [ 2 ]

4 голосов
/ 26 февраля 2011

Я решил ту же проблему сегодня, используя 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 голосов
/ 11 августа 2010

Почему бы просто:

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

или даже

File.WriteAllBytes("file.xml", content);
...