C# 覆盖流阅读器,但我可以关闭并重新打开它吗?

本文关键字:新打开 我可以 覆盖 | 更新日期: 2023-09-27 18:20:48

我正在将我的一些 cvs 读取代码合并到一个类中,我正在考虑让它覆盖 streamreader。 但是,我想保留我添加的类私有值(分隔符、记录计数等(,并能够关闭并重新打开文件。

我需要能够的原因是快速传递以确定各种内容,例如分隔符、数据中是否有嵌入的换行符、实际记录计数、字段计数等。

显然我不能使用 (streamreader sr = new streamreadder(文件名((,因为这会在最后破坏对象,但我可以关闭文件并重新打开它吗? 我可以做 cvsstreamclass sr = new cvsstreamclass(filename(,然后是 sr.close(( 和 sr.open((吗? 我知道流读者搜索有问题,所以我可能不应该只使用它。

还是我做错了,我应该将流阅读器对象传递给处理解析之类的类吗?

顺便说一句,我不是在考虑切换到开源 cvs 类或其他库。我已经编写了很多这样的代码,并且可以工作。无需建议。

C# 覆盖流阅读器,但我可以关闭并重新打开它吗?

CSV 解析器不是StreamReader。两者没有关系,不应该有继承关系。

您的CsvReader类应具有StreamReader成员。您可以根据需要设置和操作该成员。例如,您可以随时关闭现有读取器并创建一个新读取器。

我建议你实际将StreamReader存储在你的读者类中。子类化StreamReader是没有意义的,除非您要以StreamReader的形式将其公开给其他代码。我会做这样的事情:

public class CSVReader
{
    private StreamReader reader;
    private string fileName;
    //Your other properties and fields here
    public CSVSReader(string filename)
    {
        this.fileName = fileName;
        InitReader();
    }
    public void CloseFile()
    {
        if (reader != null)
        {
            reader.Close();
            reader = null;
        }
    }
    public void OpenFile()
    {
        CloseFile();
        reader = new StreamReader(File.OpenRead(fileName));
    }
    //Your other methods here
}

显然,我没有使用任何 try-catch 块来打开文件,但这只是为了可读性。

你也可以从IDisposable继承,使你的类在using ()块中可用。

相关文章: