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

Why am I getting FileNotFoundException when using FileMode.OpenOrCreate?

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

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

当文件不存在时在 using 行抛出 FileNotFoundException 异常(当文件存在时它工作正常)。

当我改写如下:

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 的目的不是要在一次调用中涵盖第二个片段中的两种情况吗?

FileMode 枚举不是标志类型枚举,这意味着您不应该对其执行按位运算。 FileMode.OpenOrCreate | FileMode.Truncate 解析为 FileMode.Truncate,它需要一个文件。

一般来说,OpenOrCreateTruncate 是两种不同的打开文件的方式,因此您需要选择一种(Create 是您需要的合理替代方式,归功于@Damien_The_Unbeliever).