【问题标题】:Corrupted XML file due hard reboot in UWP c#由于 UWP c# 中的硬重启导致 XML 文件损坏
【发布时间】:2018-04-09 23:53:24
【问题描述】:

在我的代码中有一个 XML 文件,我用不同的方法从中获取信息(变量),但是当出现路灯问题(我无法控制的东西)时,这会使我的设备硬重启XML 文件损坏,我正在尝试这样做,但它在这一行中抛出异常“使用 (fsFileStream = new FileStream(musicLibraryPath...",非常感谢您的帮助。我将代码留在下面:

public async void fileExist(string fileName)
{


 try
{
    //Creates "file.xml".
    StorageFile newBlankDocument =
                await KnownFolders.MusicLibrary.CreateFileAsync(blankFile, CreationCollisionOption.FailIfExists);
}
catch (Exception)
{

}

try
{
    //Creates "configFile.xml".
    StorageFile newDocument = 
        await KnownFolders.MusicLibrary.CreateFileAsync(fileName, CreationCollisionOption.FailIfExists);
    //Gets the file
    StorageFile fileDocument = 
        await KnownFolders.MusicLibrary.GetFileAsync(fileName);

    var musicLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Music);
    String musicLibraryPath = musicLibrary.SaveFolder.Path;

    using (fsFileStream = 
        new FileStream( musicLibraryPath, FileMode.CreateNew, FileAccess.Write, FileShare.None, 1024, FileOptions.WriteThrough))
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.OmitXmlDeclaration = false;

        using (XmlWriter writer = XmlWriter.Create(fsFileStream, settings))
        {
            //Create all the XML document fields.
            writer.WriteStartDocument();
            writer.WriteStartElement("Config");
            writer.WriteStartElement("General");
            writer.WriteAttributeString("name", "DATA");
            writer.WriteStartElement("Local");
            writer.WriteElementString("something1", "");
            writer.WriteElementString("something2", "");
            writer.WriteElementString("something3", "");

            writer.WriteEndElement();
            writer.WriteEndDocument();
            writer.Flush();
            writer.Dispose();
            showReferenceWarning();
            timerReferenceWarning.Start();
        }
    }
}
catch (Exception)
{
    //The file already exist and doesn´t need to be created again.
}

}

【问题讨论】:

    标签: c# xml uwp windows-10 windows-10-universal


    【解决方案1】:

    但它在这一行“使用 (fsFileStream = new FileStream(musicLibraryPath...”) 引发异常

    Windows 应用商店应用以沙盒方式运行,并且对文件系统的访问权限非常有限。在大多数情况下,他们只能直接访问他们的安装文件夹和他们的应用程序数据文件夹。您不能直接使用Path。如果你想将数据写入xml文件,你可以await fileDocument.OpenAsync(FileAccessMode.ReadWrite)

    public async void fileExist(string fileName)
    {
        try
        {
            //Creates "file.xml".
            StorageFile newBlankDocument = await KnownFolders.MusicLibrary.CreateFileAsync("file.xml", CreationCollisionOption.FailIfExists);
        }
        catch (Exception)
        {
    
        }
        try
        {
            //Creates "configFile.xml".
            StorageFile newDocument = await KnownFolders.MusicLibrary.CreateFileAsync(fileName, CreationCollisionOption.FailIfExists);
            //Gets the file
            StorageFile fileDocument = await KnownFolders.MusicLibrary.GetFileAsync(fileName);
    
            await Task.Run(async () =>
            {
                using (var fsFileStream = await fileDocument.OpenAsync(FileAccessMode.ReadWrite))
                {
                    XmlWriterSettings settings = new XmlWriterSettings();
                    settings.Indent = true;
                    settings.OmitXmlDeclaration = false;
    
                    using (XmlWriter writer = XmlWriter.Create(fsFileStream.AsStreamForWrite(), settings))
                    {
                        //Create all the XML document fields.
                        writer.WriteStartDocument();
                        writer.WriteStartElement("Config");
                        writer.WriteStartElement("General");
                        writer.WriteAttributeString("name", "DATA");
                        writer.WriteStartElement("Local");
                        writer.WriteElementString("something1", "");
                        writer.WriteElementString("something2", "");
                        writer.WriteElementString("something3", "");
                        writer.WriteEndElement();
                        writer.WriteEndDocument();
                        writer.Flush();
                        writer.Dispose();
                    }
                }
            });
    
        }
        catch (Exception ex)
        {            
            //The file already exist and doesn´t need to be created again.
        }
    
    }
    

    请注意,如果您使用过音乐库,则需要在应用清单中声明功能。更多内容可以参考Capability

    【讨论】:

    • 是的,我已经在应用清单中提供了 musicLibrary 功能。我已经在其中保存了文件并且没有问题,问题是我必须需要“FileOptions.WriteThrough”选项,因为它可以在硬重启的情况下保护文件。您的代码还提供以下参数:无法从 Windows.Storage.Stream.IRandomAccessStream 转换为 System.IO.Stream 此处:using (XmlWriter writer = XmlWriter.Create(fsFileStream,settings)) { //Create and write all the XML document fields to the file.
    • 无法通过路径访问MusicLibrary,所以我使用文件OpenAsync的方法,并使用AsStreamForWrite()IRandomAccessStream转换为Stream
    猜你喜欢
    • 2022-01-07
    • 2017-09-02
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多