File.Open与新FileStream()

时间:2014-07-16 11:05:18

标签: c# filestream

我知道File.Open()内部调用了new FileStream()。那么为什么使用File.Open()的代码会抛出IOException并显示错误消息:

  

该进程无法访问该文件,因为该文件正由另一个进程

使用

使用FileStream()的代码不会导致此错误。

for (int i = 0; i < 20000; i++)
{
    XmlSerializer x1 = new XmlSerializer(typeof(Tasks));
    using (FileStream fileStream = File.Open(
             Settings.Default.DownloadJobFileName,
             FileMode.Open, 
             FileAccess.Read))
        {
            tasks = ((Tasks)xmlSerializer.Deserialize(fileStream));
        }

    XmlSerializer x2 = new XmlSerializer(typeof(Tasks));
    using (FileStream fileStream = File.Open(
              Settings.Default.DownloadJobFileName,
              FileMode.Create, 
              FileAccess.Write))
        {
            xmlSerializer.Serialize(fileStream, tasks);
        }
}

我使用Windows 8.1和.Net 4.0客户端配置文件,似乎在Windows Embedded Standard 2009上的情况越来越糟

1 个答案:

答案 0 :(得分:2)

您使用的构造函数/方法的FileShare选项不同:

public FileStream(String path, FileMode mode, FileAccess access) 
    : this(path, mode, access, FileShare.Read,
           DefaultBufferSize, FileOptions.None, Path.GetFileName(path), false) {
}

相比
public static FileStream Open(String path, FileMode mode, FileAccess access) {
    return Open(path,mode, access, FileShare.None);
}

public static FileStream Open(String path, FileMode mode, FileAccess access, FileShare share) {
    return new FileStream(path, mode, access, share);
}

当您创建新的FileStream时,其他进程仍然可以读取该文件。另一方面,File.Open锁定文件,以便其他进程无法访问它。