c# 覆盖 streamreader 但我可以关闭并重新打开它吗?

c# override streamreader but can I close and reopen it?

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

我需要能够的原因是快速通过以确定各种事情,例如分隔符,数据中是否有嵌入式换行符,实际记录数,字段数等

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

或者我是不是把这一切都搞错了,我是否应该将 streamreader 对象传递给一个 class 来处理解析等等?

顺便说一句,我不打算切换到开源 cvs class 或其他库。我已经编写了很多这样的代码,并且可以正常工作。没必要这么建议。

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

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

我建议您实际将 StreamReader 存储在 reader class 中。 subclassing 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 继承,使您的 class 可在 using () 块内使用。