StreamReader释放锁定文件

kos*_*kov 0 c#

嗨,我发现一个问题,如果我用FileShare.None打开一个文件然后在读取所有行后在静态类中创建StreamReader它也会释放文件

class Program
{
    static void Main(string[] args)
    {
        using (
            var fileStream = new FileStream(
                 @"SomeShareFolder\File.txt",
                FileMode.Open,
                FileAccess.Read,
                FileShare.None,
                512,
                FileOptions.None))
        {
            var lines = fileStream.ReadAllLines();
    //HERE THE FILE IS ALREADY RELESEAD so other process now if tries to open with FileStream and  FileShare.None there will not be any exception that file is locked
        }
    }
}

public static class FileStreamExtension
{
    public static List<string> ReadAllLines(this FileStream filestream, StringSplitOptions splitOption = StringSplitOptions.RemoveEmptyEntries)
    {
        var strings = new List<string>();

        using (var file = new StreamReader(filestream, Encoding.UTF8, true, 512))
        {
            string lineOfText;

            while ((lineOfText = file.ReadLine()) != null)
            {
                if (splitOption != StringSplitOptions.RemoveEmptyEntries || !string.IsNullOrEmpty(lineOfText))
                {
                    strings.Add(lineOfText);
                }
            }
        }

        return strings;
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*Fin 6

原因是你在using内部阻挡ReadAllLines.

在该块的末端StreamReader处理并且还处理下面的块FileStream.

为了避免这种情况,你可以传递leaveOpen = trueStreamReader(最后添加true,见这里):

using (var file = new StreamReader(filestream, Encoding.UTF8, true, 512, true))
Run Code Online (Sandbox Code Playgroud)