Как написать xml в WP7 с существующим потоком

Я пытаюсь разработать приложение для чтения RSS и хочу кэшировать свой RSS-канал. Что я собираюсь сделать, так это создать XML-файл в изолированном хранилище, используя фид, загруженный по URL-адресу. Вот что я сделал до сих пор.

// Constructor
    public MainPage()
    {
        InitializeComponent();
        using (IsolatedStorageFile isstorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (isstorage.FileExists(rssCacheFile))
            {
                MessageBox.Show("Reading from cache");
                readCache(rssCacheFile);
            }
            else
            {
                MessageBox.Show("Reading from web");
                readFeed(rssLink);
            }
        }
    }

    public void readFeed(string link) 
    {
        WebClient wc = new WebClient();
        wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
        wc.OpenReadAsync(new Uri(link, UriKind.Absolute));
    }

    void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {

        Stream rssStream = e.Result;
        XmlReader response = XmlReader.Create(rssStream);
        SyndicationFeed feeds = SyndicationFeed.Load(response);

        foreach (SyndicationItem f in feeds.Items) 
        {
            itemList.Add(new RssItem {Title = f.Title.Text });
        }

        listBox1.ItemsSource = itemList;

        //Write to the cache
        writeXML(rssStream);
    }

    public void writeXML(Stream rssStream) 
    {
        using (IsolatedStorageFile isstorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream isstream = new IsolatedStorageFileStream(rssCacheFile, FileMode.Create, FileAccess.Write, isstorage))
            {
                byte[] buffer = new byte[rssStream.Length];
                while (rssStream.Read(buffer, 0, buffer.Length) > 0)
                {
                    isstream.Write(buffer, 0, buffer.Length);
                }

                isstream.Flush();
                System.Threading.Thread.Sleep(0);
            }
        }
    }

    public void readCache(string fileName) 
    {
        //IsolatedStorageFile isstorage = IsolatedStorageFile.GetUserStoreForApplication();
        using (IsolatedStorageFile isstorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (isstorage.FileExists(fileName))
            {
                try
                {
                    using (isstorage)
                    {
                        IsolatedStorageFileStream stream = isstorage.OpenFile(fileName, FileMode.Open, FileAccess.Read);
                        using (StreamReader reader = new StreamReader(stream))
                        {
                            rssXml.Text = reader.ReadToEnd();
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            else 
            {
                MessageBox.Show("Cache is empty....");
            }
        }
    }

Но проблема в том, что я не могу читать из написанного XML-файла. Когда я проверяю наличие файла, он там. Но я не могу читать оттуда. Может ли кто-нибудь сказать мне решение для этого. Любая помощь будет оценена по достоинству. Спасибо.

Обновлено: я обновил приведенный выше код и не получил никаких ошибок.


person kinath_ru    schedule 30.12.2012    source источник
comment
Что вы имеете в виду под не может читать с него? Если вы имеете в виду, что было выбрано исключение, вы должны исправить свой блок catch, чтобы сохранить исключение - в настоящее время вы отбрасываете всю полезную информацию.   -  person Jon Skeet    schedule 30.12.2012
comment
Джон Скит, я имею в виду, что с помощью метода readCache() я не могу ничего прочитать из сохраненного файла xml в «rssXML» (TextBlock).   -  person kinath_ru    schedule 30.12.2012


Ответы (1)


Вы не должны помещать свою переменную isstorage в использование, потому что она будет удалена в конце использования, а это не то, что вы хотите с переменной класса. Также поместите свою потоковую переменную в readCache внутри использования, чтобы она закрывала и удаляла поток.

Также убедитесь, что вы проверили, какое исключение вы получаете, чтобы мы могли предложить лучшую помощь.

person MrSoundless    schedule 30.12.2012
comment
MrSoundless Спасибо за ответ, я сделал, как вы сказали. Тем не менее проблема существует. Я не получаю никаких ошибок, и письменный файл также существует. - person kinath_ru; 30.12.2012