C#应用程序在访问文件后锁定它们

C#应用程序在访问文件后锁定它们,c#,winforms,C#,Winforms,我已经搜索了一段时间,但还没有找到答案,所以我想我应该问一下,如果事实上已经有人问了,我会感到抱歉:) 我一直在尝试创建一个小程序来帮助我们另一个部门的一名员工,虽然该程序运行得很好,但我发现自己无法删除、移动或写入程序运行时间长的文件 我让他为需要进行的计算创建简单的配置,但我不能让他删除或编辑程序已经加载的配置 我拥有的访问这些文件的代码 configs = new List<Config>(); DirectoryInfo dir = new DirectoryInfo(Env

我已经搜索了一段时间,但还没有找到答案,所以我想我应该问一下,如果事实上已经有人问了,我会感到抱歉:)

我一直在尝试创建一个小程序来帮助我们另一个部门的一名员工,虽然该程序运行得很好,但我发现自己无法删除、移动或写入程序运行时间长的文件

我让他为需要进行的计算创建简单的配置,但我不能让他删除或编辑程序已经加载的配置

我拥有的访问这些文件的代码

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...
}
configs=newlist();
DirectoryInfo dir=新的DirectoryInfo(Environment.CurrentDirectory);
foreach(dir.GetFiles(“*.csv”)中的FileInfo文件)
{
StreamReader=新的StreamReader(file.FullName);
Config currentConfig=new Config(file.Name);
代码在这里运行。。。
}
Config类是我创建的一个简单类,它保存了csv中加载的信息

代码的其余部分不涉及文件。
非常感谢您的帮助。

您应该使用“使用”块

foreach (FileInfo file in dir.GetFiles("*.csv"))
{
    using(StreamReader reader = new StreamReader(file.FullName))
    {
         Config currentConfig = new Config(file.Name);
         // Code runs here...
    }
}

您必须关闭一个服务器,以处置您的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
}
configs=newlist();
DirectoryInfo dir=新的DirectoryInfo(Environment.CurrentDirectory);
foreach(dir.GetFiles(“*.csv”)中的FileInfo文件)
{
使用(StreamReader=newstreamreader(file.FullName))
{
Config currentConfig=new Config(file.Name);
代码在这里运行。。。
}//读卡器将在此处处理
}

正如其他人所指出的,您应该使用
using
语句(),但我想稍微解释一下“为什么部分”

这背后的原因是一个事实,你打开一个文件,阅读它并保持它打开。我喜欢C#的垃圾收集功能,但在这种情况下,它不会自动启动。您必须自己处理
(以及其他
IDisposable
对象)。您可以通过a)在处理文件时调用
reader.Close()
reader.Dispose()
来完成此操作,或者b)让C通过使用
using
语句来完成此操作

using (StreamReader reader = new StreamReader(file.FullName)) {
    //Do your stuff
}

这里发生的情况是,当程序退出
using
语句时,
读取器
using
语句的“end”处理掉。在抛出异常的情况下也是如此,而第一种情况不处理异常。在使用
的实践中,它表现为
尝试{…}最后{…}
排序块。

您没有处理读取器。就像@LarsTech说的,把它放在一个使用块中。处置或将
StreamReader
放入using@LarsTech哈!成功了。非常感谢。我一直目不转睛地盯着自己:)弗兰克,我试过处理,但没用。什么是
Config
?看起来它也在从文件中读取。。你如何处理
reader
?@Jeroen Config是我创建的一个类,用来保存我读取的文件中的数据。@aSnejbjerg其他答案之间有什么区别?我只是太快了,没有理会这个问题,因为你说dispose-它们是一样的。daniell89比我快了16秒:这里有人告诉我C#GC收集所有东西:)@aSnejbjerg-它会的,但最终会的。作为代码编写者,您的工作是确保在类型实现
idipsable
的实例上调用
Dispose
,因为这些类型通常访问文件、内存、数据库连接等外部资源,等等。你最好在不再需要这些资源时尽快释放它们,而不是等待垃圾收集的发生。@aSnejbjerg是这样的,但正如@Igor所指出的,你必须告诉GC现在可以清理这个对象,它不需要等到程序关闭。您可以通过调用
Dispose()
;-)来实现这一点或者更好,您可以使用
using
:-)让C#调用
Dispose()
来为您处理感谢您提供的信息-这在总体上也很有帮助:)