我正在编写一个在C#中使用文本文件的程序。我使用解析器类作为文件结构和程序之间的接口。这个类包含一个StreamReader、一个StreamWriter和一个FileStream。我使用FileStream作为读者和作者的公共流,否则,当两者都打开文件时,两者会发生冲突。
解析器类有一个名为m_path的类变量,这是文件的路径。我已经仔细检查过了,路径是正确的。OpenStreams()和ResetStreams()工作得很好,但是在调用delete()函数中的CloseStreams()之后,程序会转到catch子句,所以File.Delete(m_path)不会被执行。在其他情况下,CloseStreams()函数工作得很完美。当我试图关闭StreamReader (m_writer)时,它会出错,但它确实会导致异常(文件已经关闭)。
/**
* 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; }
}我这样称呼这个函数:
parser.delete();有人能给我一些建议吗?
发布于 2015-04-23 06:12:19
您的File.Delete(m_path);将永远不会被调用,因为这里有一个异常:
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():
m_writer.Close();
m_reader.Close();
m_fs.Close();但是,我假设这只是巧合(我使用了.NET 4.0,可能在另一个.NET版本中不能工作)。我强烈建议不要这样做。
我测试了这个:
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);但是,我知道这可能不适合您,因为您可能希望类中的读和写流作为字段可用。
至少,你有一些样品要开始.
发布于 2015-04-23 00:20:40
File.Delete应该可以工作,要么您没有调用delete方法,要么m_path是一个无效的路径
https://stackoverflow.com/questions/29811270
复制相似问题