使用 System.IO.File 辅助方法的“顺序”文件 I/O 安全吗?

2024-04-04

我刚刚看到这个问题:在 C# 中的 File 类上使用静态方法安全吗? https://stackoverflow.com/q/32413634/1207195。总结一下OP有一个IOException因为该 ASP.NET 代码片段中正在使用文件:

var text= File.ReadAllText("path-to-file.txt");
// Do something with text
File.WriteAllText("path-to-file.txt");

我的第一个想法是这是一个simple由于多个 ASP.NET 重叠请求而导致的并发访问问题。我想解决将 I/O 集中到同步线程安全类中(或删除文件以支持其他内容)的问题。我读了两个答案,当我准备对其中一个答案投反对票时,我看到了这些用户是谁,我想什么啊*然后停了下来。

我将引用它们(然后请参阅原始答案以获取更多上下文)。

对于这个OP段落:

我猜测文件读取操作有时不会在写入操作发生之前关闭文件[...]

一个答案说:

正确的。文件系统不能很好地支持原子更新 [...] 使用 FileStream 没有帮助 [...] 文件内部没有魔力。为了方便起见,它只是使用 FileStream 包装。

然而,我没有看到任何原子操作的期望(读取+后续写入)并且parallel(因为多线程请求部分重叠)可能会导致并发访问。甚至一个atomicI/O 操作(读+写)也会有完全相同的问题。好的FileStream may是异步的,但不是异步的File.ReadAllText() and File.WriteAllText() use it.

另一个答案让我更加困惑, 它说:

尽管根据文档,文件句柄保证通过此方法关闭,但即使引发异常,也不能保证关闭时间发生在方法返回之前:关闭可以异步完成。

什么? MSDN 说该方法将打开、读取和关闭文件(也有例外情况)。这种方法是否有可能异步关闭文件?操作系统会推迟吗CloseHandle()?在哪些情况下?为什么?

简而言之:这只是一场误会还是CloseHandle()是异步的吗?我缺少一些东西极其重要的?


如果你看一下CloseHandle https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211(v=vs.85).aspx文档中,它指出每个打开句柄的方法都有如何关闭它的描述:

创建这些对象的函数的文档 指示当您完成后应使用 CloseHandle 对象,以及对象上的挂起操作之后会发生什么 手柄已关闭。一般来说,CloseHandle 会使 指定的对象句柄,减少对象的句柄计数,并且 执行对象保留检查。在对象的最后一个句柄之后 关闭后,该对象将从系统中删除。

当你看着CreateFile https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx文档,这就是它所说的:

当应用程序使用返回的对象句柄完成时 CreateFile,使用CloseHandle函数关闭句柄。这不 仅释放系统资源,但可以对事物产生更广泛的影响 例如共享文件或设备并将数据提交到磁盘。

我会觉得很奇怪CloseHandle将导致底层句柄关闭,同时异步保留文件以进行额外检查。这会削弱操作系统对调用者做出的许多保证,并且会成为许多错误的根源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 System.IO.File 辅助方法的“顺序”文件 I/O 安全吗? 的相关文章

  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • 串行 I/O 与 Windows/Windows CE 重叠/不重叠

    抱歉 这不是一个大问题 但更多的是帮助那些在这些特定问题上遇到问题的人 我正在解决的问题需要使用串行 I O 但主要在 Windows CE 6 0 下运行 然而 最近有人问我该应用程序是否也可以在 Windows 下运行 所以我开始着手解
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐