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

时间:2017-04-05 13:36:35

标签: c# winforms

我一直在寻找一段时间,而且我还没有找到答案,所以我想我会问,如果事实上已经提出问题我很抱歉:)

我一直在努力创建一个帮助我们其他部门人员的小程序,虽然程序运行得很好,但我发现自己无法删除,移动或写入已被访问过的文件程序运行时的程序。

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

我访问文件的代码

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的信息。

其余代码无法触摸文件。 任何帮助表示赞赏。

3 个答案:

答案 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语句时readerusing语句的“结尾”处理掉。在抛出异常的情况下也是如此,第一种情况不能处理。在练习using中,它表现为try { ... } finally { ... }种类。