首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用FileStreams在C#中删除文件时遇到一些问题

在使用FileStreams在C#中删除文件时遇到一些问题
EN

Stack Overflow用户
提问于 2015-04-23 00:11:53
回答 2查看 1.7K关注 0票数 1

我正在编写一个在C#中使用文本文件的程序。我使用解析器类作为文件结构和程序之间的接口。这个类包含一个StreamReader、一个StreamWriter和一个FileStream。我使用FileStream作为读者和作者的公共流,否则,当两者都打开文件时,两者会发生冲突。

解析器类有一个名为m_path的类变量,这是文件的路径。我已经仔细检查过了,路径是正确的。OpenStreams()ResetStreams()工作得很好,但是在调用delete()函数中的CloseStreams()之后,程序会转到catch子句,所以File.Delete(m_path)不会被执行。在其他情况下,CloseStreams()函数工作得很完美。当我试图关闭StreamReader (m_writer)时,它会出错,但它确实会导致异常(文件已经关闭)。

代码语言:javascript
复制
   /**
     * Function to close the streams.
     */
    private void closeStreams() {
        if (m_streamOpen) {
            m_fs.Close();
            m_reader.Close();
            m_writer.Close(); // Goes wrong

            m_streamOpen = false;
        }
    }

   /**
     * Deletes the file.
     */
    public int delete() {
        try {
            closeStreams(); // Catch after this
            File.Delete(m_path);

            return 0;
        }
        catch { return -1; }
    }

我这样称呼这个函数:

代码语言:javascript
复制
parser.delete();

有人能给我一些建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-23 06:12:19

您的File.Delete(m_path);将永远不会被调用,因为这里有一个异常:

代码语言:javascript
复制
private void closeStreams() {
    if (m_streamOpen) {
        m_fs.Close();
        m_reader.Close();
        m_writer.Close(); // throws an exception here

        m_streamOpen = false;
    }
}

例外情况是“无法访问已关闭的文件”。

原因在Close()StreamReader中的文档中解释了。

关闭System.IO.StreamReader对象和基础流,并释放与读取器关联的任何系统资源。

还有一些关于这种行为的文章:

Does disposing streamreader close the stream?

Is there any way to close a StreamWriter without closing its BaseStream?

Can you keep a StreamReader from disposing the underlying stream?

Avoiding dispose of underlying stream

您应该考虑重写代码并使用using()语句。

但是,我对您的代码进行了一些实验,它可以按照其他顺序调用Close()

代码语言:javascript
复制
m_writer.Close();
m_reader.Close();
m_fs.Close();

但是,我假设这只是巧合(我使用了.NET 4.0,可能在另一个.NET版本中不能工作)。我强烈建议不要这样做。

我测试了这个:

代码语言:javascript
复制
using (FileStream fs = new FileStream(m_path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
using (StreamReader reader = new StreamReader(fs))
using (StreamWriter writer = new StreamWriter(fs))
{
  // so some work here

}

File.Delete(m_path);

但是,我知道这可能不适合您,因为您可能希望类中的读和写流作为字段可用。

至少,你有一些样品要开始.

票数 0
EN

Stack Overflow用户

发布于 2015-04-23 00:20:40

File.Delete应该可以工作,要么您没有调用delete方法,要么m_path是一个无效的路径

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29811270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档