【问题标题】:How to update and delete a specific line from a text file in C# windows form [closed]如何在 C# windows 窗体中更新和删除文本文件中的特定行[关闭]
【发布时间】:2013-08-02 21:05:06
【问题描述】:

我是 C# 中使用文件处理程序的新手。我已经完成了插入和搜索。请帮助我如何使用以下代码进行更新和删除。

界面部分::

 private void btnAdd1_Click(object sender, EventArgs e)
 {
     StudentManager sm = new StudentManager();
     sm.AddStudent(textName.Text,textId.Text,textDpt.Text,textSem.Text);
 }

 public void btnSearch1_Click(object sender, EventArgs e)
 {
        StudentManager sm = new StudentManager();
        Student s = sm.FindStudent(textId.Text);
        if (s != null)
        {
            this.textName.Text = s.GetName();
            this.textId.Text = s.ID;
            this.textDpt.Text = s.Department; 
            this.textSem.Text = s.GetSEM();              
        }
 }

验证::

   string id = String.Empty;
   public void SetName(string name)
   {
        if(!String.IsNullOrEmpty(name))
        {
            this.name = name;
        }
    }

    public string ID
    {
        get { return id; }
        set { id = value; }
    }

   string department = String.Empty;

    public string Department
    {
        get { return department; }
        set { department = value; }
    }

    string SEM= String.Empty;

    public void SetSEM(string sem)
    {
        if (!String.IsNullOrEmpty(sem))
        {
            this.SEM = sem;
        }
    }

    public string GetSEM()
    {
        return this.SEM;
    }
     public String GetName()
    {
        return this.name;
    }

}

学生经理::

class StudentManager
{    
    ArrayList students;
    const string FILENAME = @"d:\students.txt";

    public StudentManager()
    {
        SetStudentList();
    }

    private void SetStudentList()
    {
        if (students == null)
        {
            //create a file handler
            FileHandler sfh = new FileHandler();
            //initialize the teacher list object
            students = new ArrayList();

            //Now read all the lines from the teacher.txt
            //each line represent a teacher
            string[] studentfromfile = sfh.getAllLines(@FILENAME);
            int totalstudents = studentfromfile.Length;

            //go through each teacher and create teacher object to add it to the teacher list.
            for (int i = 0; i < totalstudents; i++)
            {
                string studentinfo = studentfromfile[i];
                string[] studentinfobroken = studentinfo.Split(new char[] { ',' });
                if (studentinfobroken.Length == 4)
                {
                    //this part is being duplicated - can think how?
                    Student s = new Student();
                    s.SetName(studentinfobroken[0]);
                    s.ID= studentinfobroken[1];
                    s.Department = studentinfobroken[2];
                    s.SetSEM(studentinfobroken[3]);
                    this.students.Add(s);
                }
            }
        }
    }

 public void AddStudent(string fullname, string ID, string dept,string Semester )
 {
        Student s = new Student();
        s.SetName(fullname);
        s.ID = ID;
        s.Department = dept;
        s.SetSEM(Semester);
        this.students.Add(s);
        FileHandler sfh = new FileHandler();
        string studentInfo = Environment.NewLine + s.GetName() + "," + s.ID + "," + s.Department + "," + s.GetSEM();
        sfh.AddLine(@FILENAME, studentInfo);
    }

   public Student FindStudent(string ID)
   {
        foreach (Student s in students)
        {
            if (s.ID.Equals(ID))
            {
                return s;
            }
        }
        return null;
    }

  class FileHandler
  {
    public String[] getAllLines(string fileName)
    {
        try
        {
            String[] lines = File.ReadAllLines(@fileName);
            return lines;
        }
        catch (Exception e)
        {
            throw e;
        }
    }

    public String GetAllText(string fileName)
    {
        try
        {
            String content = File.ReadAllText(@fileName);
            return content;
        }
        catch (Exception e)
        {
            throw e;
        }
    }

    public void AddLine(string filename, string line)
    {
        StreamWriter sr = null;
        try
        {
            sr = new StreamWriter(@filename, true);//true for append
            sr.WriteLine(line);
        }
        catch (Exception e)
        {
            throw e;
        }
        finally
        {
            sr.Close();
        }
    }

【问题讨论】:

  • 您要更新和删除哪一行?你是怎么找到的?
  • 老实说,我刚读完你的开场白就直接滚动到评论部分。您应该包含相关的代码,这会让人们望而却步
  • 首先我在我的 student.txt 文件中插入了一些行..然后我通过 id 搜索特定的学生信息..然后我想删除该学生信息..并更新!!请先生帮助我..
  • 不要发布您的所有代码。这不是代码审查会议,发布仅与您的问题相关的代码。 Google 和 Stackoverflow 上也有大量示例,如果您进行简单搜索,您现在可能已经有了解决方案
  • 文本文件是如何格式化的? ID 出现在行中的什么位置?您提供了足够的代码(太多了!:)),但没有足够的相关细节信息。

标签: c# winforms text-files filehandler


【解决方案1】:

好的,我查看了您的代码,看起来好像您在所做的每一件小事之后都更新了您的文本文件,这是错误的方法..(如果我错了,请减少示例中的代码以使其成为可能更容易阅读!)

您应该尝试做的是在程序加载时,将学生从文件加载到学生的list 中。然后,当您的程序持续存在时,您应该在需要的任何地方使用此列表。当你准备好关闭你的程序时,然后你将它写回到文件中。

除了明显的效率和易用性之外,这种方式的一个优点是可以取消更改,而不会破坏您唯一的学生副本。

例如

studentList.Remove(student) - Remove from list
studentList.Add(student) - add
studentList.Where(x => x.Name = "Joe"); - Filter

【讨论】:

    【解决方案2】:

    更新

    studentfromfile[5] = "updated line";
    File.WriteAllLines(FILENAME, studentfromfile);
    

    删除

    studentfromfile[5] = String.Empty;
    studentfromfile = studentfromfile.Where(x => !String.IsNullOrEmpty(x)).ToArray();
    File.WriteAllLines(FILENAME, studentfromfile);
    

    有更好的方法来做到这一点,例如使用 Sayse 推荐的集合。您不应该使用 ArrayLists,如果您正在创建一个面向 .Net 2.0 及更高版本的项目(使用 List),则不需要它们,并且您不应该抛出这样的异常,因为您正在丢失堆栈跟踪。使用

    try
    {
       String content = File.ReadAllText(@fileName);
       return content;
    }
    catch (Exception e)
    {
        throw; //not throw e;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多