You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#实现写入TXT文件时记录ID自动自增的方法咨询

解决文本文件数据库的ID自增问题

Hey there! Let's fix your ID auto-increment issue step by step—your current code has a couple of critical problems that are preventing it from working as expected, plus it might trigger file access errors.

First, let's spot the issues in your existing code

  • Nested StreamReader/StreamWriter: You're trying to write to the file while still reading from it, which will immediately lock the file and throw an IO exception.
  • Incorrect ID calculation: Right now, you're incrementing the ID and writing a new record every time you read a line—this would create duplicate entries and doesn't actually use the highest existing ID as the base for incrementing.

Here's the corrected solution


Step 1: Get the next auto-incremented ID properly

To generate the correct next ID, we first need to scan all existing records in the file, find the highest ID value, then add 1 to it. If the file is empty or has no records, we start at ID 1.

Step 2: Fixed save method (separate read/write operations)

We'll split the read and write steps to avoid file locking, and calculate the next ID correctly:

private void SaveStudentData()
{
    int nextId = 1;
    string filePath = "D:\\123.txt";

    // Step 1: Read existing records to find the highest ID
    if (File.Exists(filePath))
    {
        using (StreamReader sr = new StreamReader(filePath))
        {
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                // Split the line, ignoring extra spaces
                var recordParts = line.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
                // Try to parse the ID to avoid format errors
                if (recordParts.Length > 0 && int.TryParse(recordParts[0], out int currentId))
                {
                    if (currentId >= nextId)
                    {
                        nextId = currentId + 1;
                    }
                }
            }
        }
    }

    // Step 2: Write the new record with the calculated ID
    try
    {
        // Use "true" to append to the file instead of overwriting it
        using (StreamWriter writer = new StreamWriter(filePath, true))
        {
            writer.WriteLine($"{nextId} {TBName.Text} {TBLName.Text} {TBMName.Text} {TBInfo.Text} {TBMat.Text} {TBFiz.Text}");
        }
        MessageBox.Show("数据已成功保存!");
        
        // Refresh the DataGrid right after saving
        Work();
    }
    catch (IOException ex)
    {
        MessageBox.Show($"写入文件失败:{ex.Message}");
    }
}

Step 3: Robustify your DataGrid loading method

Your existing Work method works, but we can add safeguards to handle empty lines or malformed records:

private void Work()
{
    try
    {
        List<Student> studentList = new List<Student>();
        string fileName = "D:\\123.txt";
        
        // Exit early if the file doesn't exist
        if (!File.Exists(fileName))
        {
            DGridStudents.ItemsSource = studentList;
            return;
        }

        using (StreamReader sr = new StreamReader(fileName))
        {
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                line = line.Trim();
                // Skip empty lines
                if (string.IsNullOrEmpty(line)) continue;
                
                var parsed = line.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
                // Make sure we have enough parts to avoid index errors
                if (parsed.Length >= 7)
                {
                    // Use TryParse to prevent crashes from bad data
                    if (int.TryParse(parsed[0], out int id)
                        && int.TryParse(parsed[4], out int info)
                        && int.TryParse(parsed[5], out int mat)
                        && int.TryParse(parsed[6], out int fiz))
                    {
                        studentList.Add(new Student(id, parsed[1], parsed[2], parsed[3], info, mat, fiz));
                    }
                }
            }
        }
        DGridStudents.ItemsSource = studentList;
    }
    catch(Exception ex)
    {
        MessageBox.Show($"加载数据失败:{ex.Message}");
    }
}

Key takeaways to remember

  • Never nest StreamReader and StreamWriter on the same file: This will always cause file locking conflicts.
  • Use StringSplitOptions.RemoveEmptyEntries: Prevents empty elements in your split array when there are multiple spaces.
  • Prefer int.TryParse over Convert.ToInt32: It gracefully handles malformed numbers instead of crashing your app.
  • Always use append mode (true parameter) for StreamWriter: You don't want to overwrite all existing data when adding a new record.

内容的提问来源于stack exchange,提问作者roxyashechka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 08:52:34