【问题标题】:C# The file under use even with close() , append doesn't workC# 即使使用 close() ,正在使用的文件,追加也不起作用
【发布时间】:2023-04-09 10:22:01
【问题描述】:

我一直在尝试写这个以列出我的文件夹,附加部分不起作用,它会重写整个内容,如果我尝试在不退出应用程序的情况下列出其他内容,它会给出“文件正在使用”错误,这对我来说没有意义,因为我在每个循环结束时都使用了 close()。

我在这里检查了几乎所有 Microsoft 文档和大量帖子,但找不到我的答案。

The Picture that shows the Error I get

提前非常感谢!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Anime_Lister
{
    public partial class Anime0Lister : Form
    {


        public void Appen()
        {
            using (System.IO.StreamWriter file = new System.IO.StreamWriter(path0save.Text, true))
            {


                DirectoryInfo directory = new DirectoryInfo(path0tb.Text);

                DirectoryInfo[] directory0Arr = directory.GetDirectories();

                foreach (DirectoryInfo dir in directory0Arr)
                {
                    String Parent = Convert.ToString(dir.Parent);
                    String Name = Convert.ToString(dir.Name);
                    String Root = Convert.ToString(dir.Root);


                    File.AppendAllText(path0save.Text, Parent);
                    File.AppendAllText(path0save.Text, "   || ");
                    File.AppendAllText(path0save.Text, Name + System.Environment.NewLine);
                    File.AppendAllText(path0save.Text, Root + System.Environment.NewLine);


                }

            }
        }

        public void Writer()
        {

            using (System.IO.StreamWriter file = new System.IO.StreamWriter(path0save.Text))
            {

                DirectoryInfo directory = new DirectoryInfo(path0tb.Text);

                DirectoryInfo[] directory0Arr = directory.GetDirectories();

                foreach (DirectoryInfo dir in directory0Arr)
                {
                    String Parent = Convert.ToString(dir.Parent);
                    String Name = Convert.ToString(dir.Name);
                    String Root = Convert.ToString(dir.Root);

                    file.Write(Parent);
                    file.Write("   || ");
                    file.WriteLine(Name);

                    file.WriteLine(Root);




                }

            }



        }


        public void Browser()
        {

            FolderBrowserDialog address = new FolderBrowserDialog();
            if (address.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                path0tb.Text = address.SelectedPath;



        }

        public void Browser2()
        {

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                path0save.Text = saveFileDialog1.FileName;
            }



        }

        public Anime0Lister()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //_____________________________________________________________List







            {

                try
                {


                    if (existing0file.Checked == true)
                    {
                        Appen();
                    }
                    else
                    {
                        Writer();
                    }    

                }


                catch (Exception Fail)
                {
                    MessageBox.Show(Fail.Message);


                }



            }

        }


    }
}

【问题讨论】:

  • 您是否使用了错误的方法?不是“File.AppendAllText”而是“file.Write”?
  • 在另一个函数中使用 file.appenedalltext
  • 如果是这样,那么您必须将“文件”传递给该函数。否则你想如何将它附加到文件中?可能您每次都创建新文件。

标签: c# io append


【解决方案1】:

StreamWriter 这样的一次性对象应始终包含在Using 语句中,以确保即使出现异常,该对象也会关闭并释放其非托管资源以供重用。该语言为此提供了一个特定的声明,(Using Stetement)但是,在您的特定情况下,如果您使用StreamWriter 打开文件,那么您不能使用File.AppendAllText,因为此方法会尝试自己打开文件并发现它被之前打开的 StreamWriter“使用”

    public void Appen()
    {
        using(System.IO.StreamWriter file = new System.IO.StreamWriter(path0save.Text, true))
        {
             DirectoryInfo directory = new DirectoryInfo(path0tb.Text);
             DirectoryInfo[] directory0Arr = directory.GetDirectories();

             foreach (DirectoryInfo dir in directory0Arr)
             {
                 // No need for those Convert.ToString. 
                 // The DirectoryInfo properties used are already strings.

                 file.Write(dir.Parent);
                 file.Write("   || ");
                 file.WriteLine(dir.Name);
                 file.WriteLine(dir.Root);

                 // or just in one line
                 //file.WriteLine(string.Concat(dir.Parent, 
                 //                      "   || ", 
                 //                      dir.Name, 
                 //                      Environment.NewLine,  
                 //                      dir.Root));  

            }
        }
    }

同样的 using 语句应该应用于 Writer 方法...

【讨论】:

  • 感谢您抽出宝贵时间回答我的问题,但我仍然遇到同样的错误,告诉我文件正在被另一个进程使用! (我实际上将它用于附加部分)
  • 我已经测试了这段代码并且没有给出任何此类错误,所以,也许问题出在其他地方。 (如果两个文本框指向同一个文件夹)你确定第一个文本框包含文件名而不是文件夹名吗? (尽管例外情况不同)
  • 添加了一个显示问题的图片的链接也将代码更改为我目前使用的完整代码(再次感谢您)我主要关注附加部分
  • 再次,查看您的代码(如果这是整个代码),没有任何东西可以锁定文件。您确定目标文件没有被其他应用程序或在您自己的文件夹(Timer、Task、BackgroundWorker)上运行的其他线程打开吗?
  • 我不认为第一句话是正确的。见这里:stackoverflow.com/a/7525134/148897
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
相关资源
最近更新 更多