C#:检查文件是不是存在 - 进程无法访问文件错误

Posted

技术标签:

【中文标题】C#:检查文件是不是存在 - 进程无法访问文件错误【英文标题】:C#: check if file exists - process cannot access file errorC#:检查文件是否存在 - 进程无法访问文件错误 【发布时间】:2013-09-29 08:19:12 【问题描述】:

我现在正在学习 c#,我想检查文件是否存在。如果它存在,它应该加载并写入一个 xml 文件。如果它不存在,它应该创建它,然后它应该加载和写入 xml 文件。但是如果我点击我的按钮,就会出现错误:

“该进程无法访问该文件,因为它正被另一个进程使用。”

在这里你可以看到我的代码:

private void btnSave_Click(object sender, EventArgs e)

    XElement xmlnode = new XElement("Namespace",
            new XElement("RandomText1", textBox1.Text),
            new XElement("RandomText2", textBox2.Text),
            new XElement("RandomText3", textBox3.Text)
    );

    XElement xmlFile;
    try
    
        xmlFile = XElement.Load("testsave.xml");
        xmlFile.Add(xmlnode);
    
    catch (XmlException)
    
        xmlFile = new XElement("Test", xmlnode);
    

    xmlFile.Save("testsave.xml");
    DataSet ds = new DataSet();
    ds.ReadXml("testsave.xml");
    DataTable dt = ds.Tables[0];
    dataGridView1.DataSource = dt;


private void Form1_Load(object sender, EventArgs e)

    if (!File.Exists("testsave.xml"))
    
        File.Create("testsave.xml");
    

【问题讨论】:

关闭File.Create()返回的FileStream。 为什么要在Form1_Load 中检查/创建xml 文件,而不是在btnSave_Clicktry/catch 之前? 那是另一个想法。有什么不同?欢迎每一个提示,因为我正在学习:) 写软件的时候,有时候偷懒是好事。只做你必须的事情。当您打开表单时,您是否必须确保文件存在?还有什么依赖于此,还是只是一个按钮?如果有人打开表单但没有按下按钮怎么办?然后可能会不必要地创建该文件。此外,您甚至不必像那样创建它。 xmlFile.Save("...") 会在它不存在时创建它,所以你只需要检查它是否存在就知道你是否应该尝试加载它。 最后,DataSet.ReadXml 有一个重载,它需要一个字符串。您已经在xmlFile 变量中拥有了testsave.xml 的完整内容。因此,当您可以像ds.ReadXml(xmlFile.ToString()); 一样传递它时,无需走漫长(且缓慢)的方式并从您刚刚保存数据的磁盘中检索该数据。 【参考方案1】:

如果您在另一个程序中打开该文件,则会发生此错误。如果您在其他程序中打开过它,请关闭它并再次运行您的应用程序

【讨论】:

我只是在其中打开 VS2012 进行调试,别处没有【参考方案2】:

问题是File.Create 创建一个文件并返回您打开的FileStream。因此,当您稍后尝试访问它时,您会遇到异常。您必须先关闭它才能稍后使用它。

试试这个

using (File.Create("testsave.xml"))
 

或者

File.Create("testsave.xml").Close();

【讨论】:

啊啊啊好极了!非常感谢:)听起来合乎逻辑:)

以上是关于C#:检查文件是不是存在 - 进程无法访问文件错误的主要内容,如果未能解决你的问题,请参考以下文章

无法创建临时文件夹错误5拒绝访问

C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题

Flutter 错误:无法找到 gradlew 脚本。检查bat文件是不是存在或android文件夹是不是可读

另一个进程使用的文件[重复]

有没有办法检查文件是不是正在使用?

c#异常进程无法访问文件