我一直在寻找一段时间,而且我还没有找到答案,所以我想我会问,如果事实上已经提出问题我很抱歉:)
我一直在努力创建一个帮助我们其他部门人员的小程序,虽然程序运行得很好,但我发现自己无法删除,移动或写入已被访问过的文件程序运行时的程序。
我让他为他需要进行的计算创建简单的配置,但是我不能让他删除或编辑程序已经加载的配置。
我访问文件的代码
configs = new List<Config>();
DirectoryInfo dir = new DirectoryInfo(Environment.CurrentDirectory);
foreach (FileInfo file in dir.GetFiles("*.csv"))
{
StreamReader reader = new StreamReader(file.FullName);
Config currentConfig = new Config(file.Name);
Code runs here...
}
Config类是我创建的一个简单类,它包含来自
中加载的csv的信息。其余代码无法触摸文件。 任何帮助表示赞赏。
答案 0 :(得分:0)
你应该使用'使用'块
foreach (FileInfo file in dir.GetFiles("*.csv"))
{
using(StreamReader reader = new StreamReader(file.FullName))
{
Config currentConfig = new Config(file.Name);
// Code runs here...
}
}
答案 1 :(得分:0)
您必须关闭一个Dispose您的StreamReader:
configs = new List<Config>();
DirectoryInfo dir = new DirectoryInfo(Environment.CurrentDirectory);
foreach (FileInfo file in dir.GetFiles("*.csv"))
{
using(StreamReader reader = new StreamReader(file.FullName))
{
Config currentConfig = new Config(file.Name);
Code runs here...
} // reader will be disposed here
}
答案 2 :(得分:0)
正如其他人所指出的那样,你应该使用using
声明(MSDN reference),但我想稍微解释'为什么部分'。
这背后的原因是,您打开一个文件,阅读它并保持打开。我喜欢C#的垃圾收集,但在这种情况下,它本身并没有开始。您必须自己处理Streams
(和其他IDisposable
个对象)。您可以通过以下方式执行此操作:a)完成文件后调用reader.Close()
和reader.Dispose()
,或者b)让C#使用using
语句为您执行此操作
using (StreamReader reader = new StreamReader(file.FullName)) {
//Do your stuff
}
这里发生的是当程序退出using
语句时reader
被using
语句的“结尾”处理掉。在抛出异常的情况下也是如此,第一种情况不能处理。在练习using
中,它表现为try { ... } finally { ... }
种类。