当前位置: 首页 > 知识库问答 >
问题:

C#XML值不能为空。参数名称:值[重复]

姚俊材
2023-03-14

我做了一个自动加载用户设置xml文件的程序,但一个问题是,当我在代码中添加新值时,程序试图读取没有“data5”值的xml文件时,程序返回一个错误:

当我关闭程序时,我得到了另一个关于另一个进程使用的文件的错误

An unhandled exception of type 'System.IO.IOException' occurred in mscorlib.dll

Additional information: The process cannot access the file 'C:\Users\xxxxx\AppData\Local\APK Easy Tool\cfg.xml' because it is being used by another process.

我不明白为什么文件仍然被锁定。它应该在read.close();之后关闭。我试图让程序在读取xml之前创建一个新的xml值,但这不是一个好主意,因为它将替换修改后的值。这是我的密码

docs = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\APK";
if (File.Exists(docs + @"\cfg.xml"))
            {
                try
                {
                    XmlSerializer xs = new XmlSerializer(typeof(Data));
                    FileStream read = new FileStream(docs + @"\cfg.xml", FileMode.Open, FileAccess.Read, FileShare.Read);
                    Data info = (Data)xs.Deserialize(read);
                    signApkCheckBox.Checked = bool.Parse(info.Data1);
                    pathOfApk.Text = info.Data2;
                    pathOfDec.Text = info.Data3;
                    pathOfCom.Text = info.Data4;
                    disableDebugChkBox.Checked = bool.Parse(info.Data5);
                    read.Close();             
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
private void ApkForm_FormClosed(object sender, FormClosedEventArgs e)
{
    /*
    Properties.Settings.Default.textBoxDec = pathOfDec.Text;
    Properties.Settings.Default.textBoxCom = pathOfCom.Text;
    Properties.Settings.Default.textBoxSelApk = pathOfApk.Text;
    Properties.Settings.Default.checkSignApk = signApkCheckBox.Checked;
    Properties.Settings.Default.Save();
    */

    Data info = new Data();
    info.Data1 = signApkCheckBox.Checked.ToString();
    info.Data2 = pathOfApk.Text;
    info.Data3 = pathOfDec.Text;
    info.Data4 = pathOfCom.Text;
    info.Data5 = disableDebugChkBox.Checked.ToString();
    SaveXML.SaveData(info, docs + @"\cfg.xml");
}
using System.Xml.Serialization;
using System.IO;

namespace APK
{
    public class SaveXML
    {
        public static void SaveData(object obj, string filename)
        {
            XmlSerializer sr = new XmlSerializer(obj.GetType());
            TextWriter writer = new StreamWriter(filename);
            sr.Serialize(writer, obj);
            writer.Close();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace APK
{
    public class Data
    {
        private string data1, data2, data3, data4, data5;

        public string Data1
        {
            get { return data1; }
            set { data1 = value; }
        }

        public string Data2
        {
            get { return data2; }
            set { data2 = value; }
        }

        public string Data3
        {
            get { return data3; }
            set { data3 = value; }
        }

        public string Data4
        {
            get { return data4; }
            set { data4 = value; }
        }

        public string Data5
        {
            get { return data5; }
            set { data5 = value; }
        }
    }
}

共有1个答案

陶成化
2023-03-14

也许这不能解决问题,但在read.close();之前,将read.endread();放入或只是尝试在catch语句上关闭它。但如前所述,最好的选择是这样做:

if (File.Exists(docs + @"\cfg.xml"))
            {
                try
                {
                    using (FileStream read = new FileStream(docs + @"\cfg.xml", FileMode.Open, FileAccess.Read, FileShare.Read)){
                        XmlSerializer xs = new XmlSerializer(typeof(Data));
                        Data info = (Data)xs.Deserialize(read);
                        signApkCheckBox.Checked = bool.Parse(info.Data1);
                        pathOfApk.Text = info.Data2;
                        pathOfDec.Text = info.Data3;
                        pathOfCom.Text = info.Data4;
                        disableDebugChkBox.Checked = bool.Parse(info.Data5);            
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

这样你就不需要担心关闭文件了,它是“自动”完成的。

 类似资料:
  • 问题内容: 我试图在我的appsettings.json文件中写入连接字符串,并将其带入我的启动文件中,但我不断得到一个Value不能为null。参数名称:connectionString。我一直在使用各种示例,但似乎看不到带有ASP.NET 1.0 Core启动类的新设置。 Appsetting.json文件: 尝试Startup.cs的方法 问题答案: 首先, 与在Visual Studio中

  • 为了将位图转换为base64,我必须将位图转换为图像。当我将图像转换为时,在从屏幕拍摄位图(如或)转换图像后,我会得到这条消息,但当我使用本地存储的图像(如)时,它工作得很好。当我不想存储屏幕截图并每次都读一遍这是我尝试过的代码时,我该如何避免这个错误呢

  • 哪个编译器就在这里?

  • 我有一个简单的点网移动应用程序,具有自定义身份验证,如下示例:(https://docs.microsoft.com/en-us/azure/app-service-mobile/app-service-mobile-dotnet-backend-how-to-use-server-sdk#custom-认证) 我有一个生成JWT令牌的endpointhttps://test2ixresearch

  • 我打算使用Python函数注释来指定静态工厂方法返回值的类型。我知道这是注释所需的用例之一。 PEP 3107规定: 函数注释只不过是在编译时将任意Python表达式与函数的各个部分关联起来的一种方式。 是Python中有效的表达式,不是吗?Python不同意,或者更确切地说,找不到名字:

  • 我有返回给我一些JSON后端。 我将其解析为我的类: 然后我从服务器(使用rxJava)检索数据,没有任何错误。但是我预料到了一个错误,因为我认为我应该做这样的事情(以防止GSON转换器错误,因为在我的JSON响应中不存在): 在从后端接收数据并将其解析到带有构造函数的SomeData类(不带def值)之后,notNullableValue的值==NULL。 据我所知,在Kotlin中不是可空值可