使用FileMode.OpenOrCreate时为什么会出现FileNotFoundException?

时间:2017-09-04 13:47:03

标签: c# asp.net .net isolatedstorage

我正在开发一个简单的ASP.NET WebApi应用程序。在控制器中,我有一个POST操作,它执行以下代码:

using (var isoStore = IsolatedStorageFile.GetUserStoreForAssembly())
{
    using (var textWriter = new StreamWriter(
        isoStore.OpenFile(filename, FileMode.OpenOrCreate | FileMode.Truncate)))
    {
        // write to file
    }
}

当文件不存在时会在FileNotFoundException行引发using异常(当文件存在时它可以正常工作)。

当我按如下方式重写时:

using (var isoStore = IsolatedStorageFile.GetUserStoreForAssembly())
{
    StreamWriter textWriter;
    if (!isoStore.FileExists(filename))
    {
        textWriter = new StreamWriter(isoStore.CreateFile(filename));
    }
    else
    {
        textWriter = new StreamWriter(
             isoStore.OpenFile(filename, FileMode.Open | FileMode.Truncate));
    }
}

一切正常,我可以写入文件,无论它是否存在。

OpenOrCreate的目的不是在一次通话中从第二个代码段中涵盖这两种情况吗?

1 个答案:

答案 0 :(得分:5)

FileMode.OpenOrCreate | FileMode.Truncate枚举不是标志类型枚举,这意味着您不应对其执行按位操作。 FileMode.Truncate解析为期望文件存在的OpenOrCreate

一般来说,TruncateCreate是打开文件的两种不同模式,因此您需要选择一个({{1}}作为您需要的合理替代方案,归功于@Damien_The_Unbeliever )。