c# - 锁定替换网站上文件的问题

标签 c# asp.net

我想用更新版本替换 IIS 网站上的现有文件。假设这些文件是大型 pdf 文档,可以通过超链接访问。该站点是 24x7 全天候运行,因此我担心在有人尝试读取文件的同时更新文件时出现锁定问题。

这些文件使用在服务器上运行的 C# 代码进行更新。 我可以想到打开文件进行写入的两个选项。

选项 1) 使用 FileShare.Read 打开文件进行写入:

using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))

当此文件处于打开状态并且用户请求通过超链接在 Web 浏览器中阅读同一文件时,文档打开为空白页。

选项 2) 使用 FileShare.None 打开文件进行写入:

using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None)) 

当此文件打开时,用户请求通过超链接在 Web 浏览器中读取同一文件,浏览器显示错误。在 IE 8 中,您得到 HTTP 500,“网站无法显示该页面”,而在 Firefox 3.5 中,您得到:“该进程无法访问该文件,因为它正被另一个进程使用。”

浏览器的行为是有道理的,而且看起来很合理。我想用户极不可能在您更新文件的同时尝试读取文件。如果以某种方式,文件更新是原子的,就像使用围绕事务的 SQL 更新数据库一样,那就太好了。

我想知道你们是否担心这类事情,并且更喜欢上述选项中的任何一个,或者甚至有自己的其他选项来更新文件。

最佳答案

如何使用不同的名称复制新版本的文件,然后执行 File.Move()将覆盖参数设置为 true?在您编写它时,您不会干扰网络服务器并且移动文件会很快。

关于c# - 锁定替换网站上文件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1829838/

相关文章:

asp.net - 获取错误 403 图像 Angular

c# - 将列表绑定(bind)到下拉列表,如何处理值?

c# - 在 RowCommand 的嵌套 GridView 中从 DropDownList 中检索值

c# - 使用 WebAPI 时停止 XSS

c# - 返回根类型的 Fluent Builder 模式

c# - 将服务器 UTC 时间转换为客户端本地时间

c# - ASP.NET Kendo UI 网格计算列

c# - 字符串常量在编译后的 DLL 中占用多少空间?

c# - 运行时和编译时有什么区别?

asp.net - IIS 默认重定向