使用c#进行文件拆分时出现问题

本文关键字:分时 问题 拆分 文件 使用 | 更新日期: 2023-09-27 18:28:27

我一直在尝试制作一个程序,将较大的文本文件拆分为较小的部分,以便更容易使用。

我目前有两个问题,无法弄清楚发生了什么。

问题1:后台工作人员有时会多次开火。我似乎不明白它为什么决定运行,或者决定运行多少次。它将运行拆分,在最终文件上,它似乎会循环回到工作的开始,然后再次运行。它还触发多个已完成的任务。更复杂的是,如果我将拆分的文件数量设置为不同的数量,我可以获得后台工作人员似乎启动的不同次数,但它与文件数量没有直接关联。有时,相同数量的文件会导致后台工作程序只启动一次,有时会启动多次。

问题2:有时拆分不会创建所有文件。对于一些文件,如果我运行它,它会创建前两个文件,然后删除其余文件。似乎只有当我将数量设置为3个文件时才会发生。如果我把行数加起来,它应该是正确的。所以我不确定那里发生了什么。

调用线程

private void StartSplit()
    {
        if (int.TryParse(NumberOfFilesTB.Text, out _numberOfFiles))
        {
            if (bg.IsBusy)
            {
                ((MainWindow)Application.Current.MainWindow).SetStatus("Warning",
                    "Please only run one split process at a time.");
                return;
            }
            ((MainWindow)Application.Current.MainWindow).DisplayAlert(
                "Split is running, you will receive an alert when it has finished. You may use other tools while the split is running.");
            var args = new List<string> { _filepath, _includeHeaders.ToString(), _numberOfFiles.ToString() };
            bg.DoWork += bg_DoWork;
            bg.WorkerReportsProgress = true;
            bg.ProgressChanged += ProgressChanged;
            bg.RunWorkerCompleted += bg_RunWorkerCompleted;
            bg.WorkerSupportsCancellation = true;
            bg.RunWorkerAsync(args);
            ProcessText.Text = "Running split process";
        }
        else
        {
            ((MainWindow)Application.Current.MainWindow).SetStatus("Warning", "Please enter a number for number of files");
        }
    }

后台线程

  private void bg_DoWork(object sender, DoWorkEventArgs e)
    {
        var args = e.Argument as List<string>;
        string filepath = args[0];
        string includeHeaders = args[1];
        int numberOfFiles = Convert.ToInt32(args[2]);
        int numberOfRows = _lineCount / numberOfFiles;
        _tempath = Path.GetDirectoryName(_filepath);
        Directory.CreateDirectory(_tempath+"''split");
        if (includeHeaders == "True")
        {
            using (var reader = new StreamReader(File.OpenRead(filepath)))
            {
                _lines.Clear();
                _header = reader.ReadLine();
                _lines.Add(_header);
                for (int i = 0; i < _lineCount; i++)
                {
                    if (bg.CancellationPending)
                    {
                        e.Cancel = true;
                        break;
                    }
                    int percentage = (i + 1) * 100 / _lineCount;
                    bg.ReportProgress(percentage);
                    _lines.Add(reader.ReadLine());
                    if (i % numberOfRows == 0)
                    {
                        _counter++;
                        Debug.WriteLine(i);
                        if (i == 0)
                        {
                            //skip first iteration 
                            _counter = 0;
                            continue;
                        }
                        _output = _tempath + "''" + "split''" + _fileNoExt + "_split-" + _counter + _fileExt;
                        _filesMade.Add(_output);
                        File.WriteAllLines(_output, _lines.ConvertAll(Convert.ToString));
                        _lines.Clear();
                        _lines.Add(_header);
                    }
                }
            }
        }
        else
        {
            using (var reader = new StreamReader(File.OpenRead(filepath)))
            {
                _lines.Clear();
                _header = reader.ReadLine();
                _lines.Add(_header);
                for (int i = 0; i < _lineCount; i++)
                {
                    if (bg.CancellationPending)
                    {
                        e.Cancel = true;
                        break;
                    }
                    int percentage = (i + 1) * 100 / _lineCount;
                    bg.ReportProgress(percentage);
                    _lines.Add(reader.ReadLine());
                    if (i % numberOfRows == 0)
                    {
                        _counter++;
                        if (i == 0)
                        {
                            //skip first iteration
                            _counter = 0;
                            continue;
                        }
                        string output = _tempath + "''" + "split''" + _fileNoExt + "_split-" + _counter + _fileExt;
                        _filesMade.Add(_output);
                        File.WriteAllLines(output, _lines.ConvertAll(Convert.ToString));
                        _lines.Clear();
                    }
                }
            }
        }
    }

运行Worker已完成

private void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Cancelled)
        {
            StopSplit();
            _filesMade.Clear();
            ProcessText.Text = "Split cancelled";
            return;
        }
        _filesMade.Clear();
        ProcessText.Text = "Split has completed, click here to open the directory";
    }

使用c#进行文件拆分时出现问题

我敢打赌你的BgW是你班的一员
在Startsplit()中,每次执行此函数时都会添加一个新的回调
这就是它运行多次的原因。

另一个答案是晚饭后。

晚餐结束了
你的计数方法在很多方面都有缺陷:
1) 如果你丢失了文件,我敢打赌这是最后一个。例如,30行,3个文件:
i % numberOfRows在i=0、10、20时为零,但i未达到30。
2) 缺少行,例如31行4个文件:
文件保存在i=7、14、21、28处。第29-31行缺失。

我建议您使用嵌套的for循环,外部的用于文件,内部的用于行,并改进您的计算。把你所有的列表和计数器都放在函数里
我希望你能感激我的回答。我讨厌在平板电脑上打字。但我也不想仅仅为了这个而启动我的电脑…;-)