none
为什么有时读取Xml文件时,获取不到文件。 RRS feed

  • 问题

  • public class DataClass
        {
            public static bool DataChanged { get; set; }
            public static bool FileExist { get; set; }
            public static bool AlreadyLoadData { get; set; }
    
            private StorageFolder library = KnownFolders.DocumentsLibrary;
            private StorageFolder storageFolder = null;
            private StorageFile configFile = null;
    
            public bool currConfig = true;
    
            XDocument xDoc = null;
            XElement xRoot = null;
            XDocument newXDoc = null;
            XElement newXRoot = null;
    
            public List<CommonData> itemDatas;
            public CommonData general;
    
    
            public String LibraConfig = "config.xml";
    
            public DataClass()
            {
                DataChanged = false;
                FileExist = true;
                AlreadyLoadData = false;
    
                itemDatas = new List<CommonData>();
                general = new GeneralData();
                
                OpenFile();
    
                itemDatas.Add(general);
            }
    
    
            //return true if file exist
            public async Task<bool> OpenFile()
            {
                storageFolder = null;
                configFile = null;
                try
                {
                    storageFolder = await library.GetFolderAsync("Config");
                    if(storageFolder != null)
                        configFile = await storageFolder.GetFileAsync("config.xml");
                }
                catch (Exception ex)
                {
                    FileExist = false;
                    Debug.WriteLine("Config file \"Config\\config.xml\" not exist !!!");
                }
    
                //if file not exist, then Do not load the xml from file
                if (storageFolder == null || configFile == null)
                {
                    FileExist = false;
                    Debug.WriteLine("File config.xml not exist!!!");
                    return false;
                }
                else
                {
                    //try to load the xml from file
                    Debug.WriteLine("Load xml from file !!!");
                    try
                    {
                        using (IRandomAccessStream readStream = await configFile.OpenAsync(FileAccessMode.Read))
                        {
                            Stream stream = readStream.AsStreamForRead();
                            xDoc = XDocument.Load(stream);
                        }
                        xRoot = xDoc.Element("Config");
                    }
                    catch (Exception ex)
                    {
                        FileExist = false;
                        Debug.WriteLine("Cannot load xml from file, maybe file is empty!!!");
                        Debug.WriteLine(ex.Message);
                        return false;
                    }
                    FileExist = true;
                    return true;
                }
            }
    
    
            public async Task<bool> DataStore()
            {
                Debug.WriteLine("DataStore Start to save file!!!");
                storageFolder = null;
                configFile = null;
                //if the Config Folder not exist, create it
                try
                {
                    storageFolder = await library.GetFolderAsync("Config");
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("Config Folder not exist!!!");
                }
                if (storageFolder == null)
                {
                    Debug.WriteLine("Create Config Folder");
                    storageFolder = await library.CreateFolderAsync("Config", CreationCollisionOption.OpenIfExists);
                    try
                    {
                        configFile = await storageFolder.CreateFileAsync(LibraConfig, CreationCollisionOption.ReplaceExisting);
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine("File config.xml not exist");
                    }
                }
              
                if (configFile == null)
                {
                    configFile = await storageFolder.CreateFileAsync(LibraConfig, CreationCollisionOption.ReplaceExisting);
                }
    
                newXDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), new XElement("Config"));
                newXRoot = newXDoc.Element("Config");
    
                //Add the xml datas to rootElement
                if(general != null)
                    general.StoreData(ref newXDoc, ref newXRoot);
    
                using (IRandomAccessStream writeStream = await configFile.OpenAsync(FileAccessMode.ReadWrite))
                {
                    await writeStream.FlushAsync();
                    newXDoc.Save(writeStream.AsStreamForWrite(), SaveOptions.None);
                    Debug.WriteLine(newXDoc.ToString());
                    Debug.WriteLine("Save file OK!!!");
                }
                return true;
            }
    
    
            public bool DataLoad()
            {
                if (xRoot == null)
                {
                    Debug.WriteLine("No data to load!");
                    return false;
                }
                else
                {
                    Debug.WriteLine("DataLoad...");
                    if(general != null)
                        general.LoadData(ref xDoc, ref xRoot);
                    return true;
                }
            } 
        }

    偶是新手刚接触开发,请帮忙看下代码,有时执行loadfile时 会出现文件为空的情况,为什么啊。谢谢

    调用时 会出现下面提示,实在不懂为什么


    2012年8月8日 8:49

答案

  • 明显的异步方法调用不当。 你设计了一个Task<bool>的异步方法,要么你用await去调用,要么你通过Task Run 等待Task完成后调用其Result 取得结果值。

    不过从你代码来看,你需要:

    1. 通过await 来调用你的异步方法,await DataStore 和 await OpenFile。不过最好你可以这么设计:

    public IAsyncOperation<bool> DataStoreAsync()
    {
        return AsyncInfo.Run<bool>(async (token) =>
        {
          ....
          return true;
        }
    }

    一个标准的异步执行方法。 具体学习参考:http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/06/22/net-winrt.aspx

    但是由于构造函数是不能够声明为async的,所以我们需要第二部分:

    2. 不修改你的异步方法,让其返回Task<bool>, 然后再构造函数中异步调用:

                bool result;
                OpenFile().ContinueWith(p =>
                {
                    result = p.Result;
                }).Wait();


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 xiaobenzhu 2012年8月10日 2:54
    2012年8月9日 6:36
    版主

全部回复

  • 明显的异步方法调用不当。 你设计了一个Task<bool>的异步方法,要么你用await去调用,要么你通过Task Run 等待Task完成后调用其Result 取得结果值。

    不过从你代码来看,你需要:

    1. 通过await 来调用你的异步方法,await DataStore 和 await OpenFile。不过最好你可以这么设计:

    public IAsyncOperation<bool> DataStoreAsync()
    {
        return AsyncInfo.Run<bool>(async (token) =>
        {
          ....
          return true;
        }
    }

    一个标准的异步执行方法。 具体学习参考:http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/06/22/net-winrt.aspx

    但是由于构造函数是不能够声明为async的,所以我们需要第二部分:

    2. 不修改你的异步方法,让其返回Task<bool>, 然后再构造函数中异步调用:

                bool result;
                OpenFile().ContinueWith(p =>
                {
                    result = p.Result;
                }).Wait();


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 xiaobenzhu 2012年8月10日 2:54
    2012年8月9日 6:36
    版主
  • 谢谢您的回答
    2012年8月10日 2:55