如何在C#窗体中更新和删除文本文件中的特定行

时间:2013-08-02 21:05:06

标签: c# winforms text-files filehandler

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

UI部分::

 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;
    }

}

studentManager ::

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();
        }
    }

2 个答案:

答案 0 :(得分:2)

好的,我已经查看了你的代码,看起来好像你在做了每件小事之后更新你的文本文件这是错误的方法..(如果我错了那么请减少你的代码示例,使其更容易阅读!)

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

除了显而易见的效率和易用性之外,这种方式的一个优点是,如果没有您的学生副本被销毁,可以取消更改。

e.g

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

答案 1 :(得分:1)

更新

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;
}