Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用FileStreams删除文件时遇到问题#_C#_File_Filestream - Fatal编程技术网

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

C# 在C中使用FileStreams删除文件时遇到问题#,c#,file,filestream,C#,File,Filestream,我正在写一个程序,它使用C#中的文本文件。 我使用解析器类作为文件结构和程序之间的接口。 此类包含一个StreamReader、一个StreamWriter和一个FileStream。我使用FileStream作为读写器的公共流,否则当它们都打开文件时,这两个流将发生冲突 解析器类有一个名为m_path的类变量,这是文件的路径。我已经详细检查过了,路径是正确的OpenStreams()和ResetStreams()工作正常,但是在delete()函数中调用CloseStreams()后,程序转到

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

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

我这样调用函数:

parser.delete();

有谁能给我一些提示吗?

File.Delete应该可以,要么你没有调用
Delete
方法,要么
m\u path
是无效路径

你的
文件。Delete(m\u path)将永远不会被调用,因为您在此处遇到异常:

private void closeStreams() {
    if (m_streamOpen) {
        m_fs.Close();
        m_reader.Close();
        m_writer.Close(); // throws an exception here

        m_streamOpen = false;
    }
}
例外情况是“无法访问已关闭的文件”

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

关闭System.IO.StreamReader对象和底层流,并释放与读取器关联的所有系统资源

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

您应该考虑重新编写代码并使用<代码>使用()/<代码>语句。

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

m_writer.Close();
m_reader.Close();
m_fs.Close();
但是,我假设这只是巧合(我使用了.NET4.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);
但是,我知道这可能不适合您,因为您可能希望读写流作为类中的字段可用


至少,您有一些示例要开始…

您认为
不起作用是什么意思?
?您有什么异常吗?您好,对不起。第一次问关于StackOverflow的问题!我已经编辑了我的问题,所以希望它现在更清楚一点。它确实抛出了一个异常,否则它不会转到catch子句。尝试
catch(Exception ex){Console.WriteLine(ex.Message);}
调试您的代码谢谢您的回答!我真的想保持我的信息流畅通,因为它经常被使用。如果我理解正确,通过关闭FileStream(m_fs),我会自动关闭m_reader和m_writer的流,这就是为什么它会出现异常?反过来说:m_reader.close();关闭m_fs。我做了一些进一步的检查:如果我使用(…第2行和第3行)交换(在我的示例代码中,我在这里也会遇到一个异常。因此,更改顺序(先关闭writer,然后关闭reader,文件流)可能真的是一个可行的解决方案。只需做一些测试和实验……正如Nils所建议的那样:添加一些catch()代码(或者对于第一次测试,完全删除所有异常处理,这比全面捕获和忽略任何错误(如代码中的错误)更好。好的,我想我理解了。谢谢你的帮助!顺便说一句,在第一次测试中忽略try-catch子句的好建议,应该在将来派上用场。当你关闭()或Dispose()写入程序可能会执行刷新()。当关闭/释放读卡器时,它也会关闭/处理流,因此如果在关闭/处理写入程序之前完成,则可能会导致隐含的刷新()。这将解释为什么首先关闭或处理写入程序(也是最内部的使用)工作。读卡器不需要刷新,因此当请求关闭/释放流时,它更可能容忍流已经关闭/释放。
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);