文件仍然锁定尽管使用StreamReader

时间:2015-07-14 12:40:12

标签: c# file io streamreader

我的程序浏览文件夹中的所有文件,读取它们,并且不更改其信息,将它们移动到另一个名称下的位置。但是我无法使用File.Move方法,因为我得到以下IOException

  

该进程无法访问该文件,因为该文件正被另一个文件使用   过程

这就是我正在阅读文件并将其所有行添加到List<string>

的方式
List<string> lines = null;
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (var sr = new StreamReader(fs, Encoding.Default))
    {
        lines = new List<string>();
        while (!sr.EndOfStream)
            lines.Add(sr.ReadLine());
    }

这是我移动文件的功能:

public static bool ArchiveFile(string filePath, string archiveFolderLocation)
{
    if (!Directory.Exists(archiveFolderLocation))
        Directory.CreateDirectory(archiveFolderLocation);
    try
    {
        string timestamp = string.Format("{0:yyyy-MM-dd HHmmss}", DateTime.Now);
        string newFileName = Path.GetFileNameWithoutExtension(filePath) + " " + timestamp;
        string destination = string.Format("{0}\\{1}{2}", archiveFolderLocation, newFileName, Path.GetExtension(filePath));
        File.Move(filePath, destination);
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}

我认为使用using语句应该在使用后进行垃圾收集和释放。如何释放文件以便我可以移动它以及为什么我的文件保持锁定状态?

解决:

知道了。在这两个调用之间的某个地方,我打开了一个TextReader对象而没有将其丢弃。

2 个答案:

答案 0 :(得分:0)

  

我认为使用using语句应该是垃圾收集和   使用后释放文件。我怎样才能释放文件   移动它以及为什么我的文件保持锁定?

不是真的。使用语句只不过是:

try { var resource = new SomeResource(); } 

finally { resource.Dispose(); // which is not GC.Collect(); }

它工作正常,因此看起来您的文件是从代码中的其他位置打开的......

P.S。 顺便说一下你可以这样做:

List<string> lines = File.ReadAllLines().ToList();

答案 1 :(得分:-2)

您可以使用:

string dpath = "D:\\Destination\\";
            string spath = "D:\\Source";
            string[] flist = Directory.GetFiles(spath);
            foreach (string item in flist)
            {
                File.Move(item, dpath + new FileInfo(item).Name);
            }

替换D:\\来源&amp; D:\\ Destination \\分别带有所需的源路径和目标路径。