System.IO.File.Delete() / System.IO.File.Move() 有时不起作用

2023-12-25

Winforms 程序需要将一些运行时信息保存到 XML 文件中。该文件有时可能有几百千字节大小。在 Beta 测试期间,我们发现一些用户会毫不犹豫地看似随机地终止进程,有时会导致文件写入一半并因此损坏。

因此,我们更改了算法以保存到临时文件,然后删除真实文件并进行移动。

我们的代码目前看起来像这样..

private void Save()
{
    XmlTextWriter streamWriter = null;
    try
    {
        streamWriter = new XmlTextWriter(xmlTempFilePath, System.Text.Encoding.UTF8);

        XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyCollection));

        xmlSerializer.Serialize(streamWriter, myCollection);

        if (streamWriter != null)
            streamWriter.Close();

        // Delete the original file
        System.IO.File.Delete(xmlFilePath);

        // Do a move over the top of the original file 
        System.IO.File.Move(xmlTempFilePath, xmlFilePath);
    }
    catch (System.Exception ex)
    {
        throw new InvalidOperationException("Could not save the xml file.", ex);
    }
    finally
    {
        if (streamWriter != null)
            streamWriter.Close();
    }
}

这在实验室和生产中几乎一直有效。该程序在 12 台计算机上运行,​​平均每 5 分钟调用一次该代码。我们每天大约会遇到一两次这样的异常:

System.InvalidOperationException: 
Could not save the xml file. 
---> System.IO.IOException: Cannot create a file when that file already exists.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.__Error.WinIOError()
at System.IO.File.Move(String sourceFileName, String destFileName)
at MyApp.MyNamespace.InternalSave()

就好像在发出移动之前实际上并未向硬盘发出删除。

Win7机器上会出现这种情况。

有几个问题:是否有一些概念Flush()一个可以为整个磁盘操作系统做些什么?这是我的代码、.net、操作系统还是其他方面的错误吗?我应该放一些吗Thread.Sleep(x)?也许我应该做一个File.Copy(src, dest, true)?我应该写下面的代码吗? (但这看起来很愚蠢。)

while (System.IO.File.Exists(xmlFilePath))
{
    System.IO.File.Delete(xmlFilePath);
}

// Do a move over the top of the main file 
bool done = false;
while (!done)
{
    try
    {
        System.IO.File.Move(xmlTempFilePath, xmlFilePath);
        done = true;
    }
    catch (System.IO.IOException)
    {
        // let it loop
    }
}

有没有人见过这个?


你永远不能假设你可以删除一个文件并remove它在多用户多任务操作系统上。除了另一个应用程序或用户本身对文件感兴趣之外,您还可以运行对文件感兴趣的服务。病毒扫描程序和搜索索引器是典型的麻烦制造者。

此类程序打开文件并尝试通过指定删除共享访问权限来最大程度地减少影响。这在 .NET 中也可用,它是 FileShare.Delete 选项。有了该选项,Windows 就允许进程删除该文件,即使该文件已打开。它在内部被标记为“删除待定”。该文件实际上并未从文件系统中删除,它在 File.Delete 调用后仍然存在。此后任何尝试打开该文件的人都会收到访问被拒绝错误。在文件对象的最后一个句柄关闭之前,文件实际上不会被删除。

您可能可以看到这是哪里,这解释了为什么 File.Delete 成功但 File.Move 失败。您需要做的是 File.Move 文件,以便它具有不同的名称。Then重命名新文件,然后删除原始文件。您要做的第一件事就是删除具有重命名名称的可能杂散副本,它可能是由于电源故障而留下的。

总结:

  1. 创建文件.new
  2. 删除文件.tmp
  3. 将 file.xml 重命名为 file.tmp
  4. 将 file.new 重命名为 file.xml
  5. 删除文件.tmp

第 5 步失败并不重要。

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

System.IO.File.Delete() / System.IO.File.Move() 有时不起作用 的相关文章

  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

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

随机推荐

  • 尝试发送大尺寸图像时 WebSocket 断开连接

    我正在使用 java 和 javascirpt 在 localhost 测试 WebSocket 运行 Tomcat 7 0 42 并且中间没有代理 它可以很好地通过 websocket 发送文本和小尺寸图像 但是 当尝试发送大尺寸照片时
  • 与同时异步任务的 SQLite 的多个连接

    在我的场景中 它有 Sync Class 与后台的 AsyncTasks 同步 从我的应用程序到我的服务器 每当我的应用程序执行一个需要更改 SQLite 数据的操作时 第一步我的应用程序会更新我的本地数据库 第二步会在后台抛出一个 Asy
  • 如何解决错误:找不到包根?

    我正在运行命令 devtools use testthat 我收到错误 错误 找不到包根目录 为什么会出现这种情况 devtools现在似乎要求用户setwd path to package 即使函数像devtools release 有p
  • 如何使用 PDFplumber 只提取 pdf 文件中没有表格的文本?

    我想使用 NLP 模块处理一些 pdf 文件 然后我想从所有现有表中清除这些文件 这是使用 pdfplumber 提取表格的代码 import pdfplumber pdf pdfplumber open file pdf page pdf
  • Ltac:通过回溯重复策略 n 次

    假设我有一个像这样的策略 取自 HaysTac 它搜索一个参数来专门化一个特定的假设 Ltac find specialize in H multimatch goal with v gt specialize H v end 然而 我想写
  • 预期异常断言

    我需要为下一个函数编写一个单元测试 我看到我可以使用 ExpectedException 这是要测试的功能 public static T FailIfEnumIsNotDefined
  • 升级到 Rails 3.2.11 后 Capistrano 部署失败

    我有生产 Rails 3 2 3 应用程序 我用它来使用 capistrano 进行部署 当我决定将 Rails 升级到 3 2 11 时 我执行了以下步骤 更改 Gemfile 中的 Rails 版本 运行 捆绑更新轨道 从供应商 缓存
  • 实体框架 IsRowVersion() 没有并发检查

    我们有一个表 其中有一列名为Version映射为 SQLrowversion 这样做是因为我们有一个映射到我们数据的外部系统 该系统依赖于每次表更新时都会更改的该列 最初我们希望通过 SQL 来处理此问题 但现在我们发现存在乐观并发异常 虽
  • Android Studio 的 VSCode 键盘快捷键

    有没有办法在 Android Studio 的键盘映射设置下添加 VSCode 作为选项 Under File gt Settings gt Keymap 列出了许多其他选项 但它们都与 VSCode 相似 事实上 JetBrains 已经
  • Alembic 检测到已经存在的表,因此它尝试再次创建它们

    我的动态表模型如下 在数据库中没有测试列 我想用 alembic 更新它 class Animation Base tablename Animation id Column Integer primary key True index T
  • SQLi 并检索特定记录

    环顾四周 看到了很多 MySQL 答案 但没有看到 MySQLi 我正在尝试返回我选择的 1 行 目前我只能返回第一行 我想要实现的是 让我的主数据库通过 ID 链接 当您单击 ID 时 可以在另一页上仔细查看记录
  • Python:列表中的非重复随机值[重复]

    这个问题在这里已经有答案了 我正在尝试用 python 2 7 编写一个程序 该程序必须选择多个随机变量并将其打印出来 但该变量不能与之前打印出的任何变量相同 我一直在浏览谷歌和这个网站 但我还没有找到任何关于字符串的东西 到目前为止我只找
  • 如何在 MVC 中进行 foreach 循环来为项目设置新值。

    我试图在类中循环抛出对象并检查其数据类型 并进行控制 如果数据类型是字符串 那么我希望此项值为空 如果数据类型为 int 则此项的值为 0 依此类推 这是我的伪代码 ProductionOrderItem i new ProductionO
  • 使用ggplot2在地图上绘制条形图

    我必须使用在地图上绘制条形图ggplot2 library ggplot2 q ggplot data mapindia aes long lat group group colour geom polygon fill FF9999 co
  • java:稀疏位向量[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Java 中有哪些著名的稀疏位向量库吗 是否有关于稀疏与稀疏使用它们的有用程度的指南 java uti
  • 用于平面到嵌套/分层的 XSLT,具有级别插值?

    给定这个源 XML 文档 输入 xml p content p p content p p content p p content p p content p p content p p content p p content p p co
  • 在 swift 中实现文档选择器 (iOS)

    我想在我的 iOS 应用程序中选择任何类型的文件 pdf docs xlsx jpeg txt rtf 等 功能 点击时Upload按钮 我希望我的应用程序打开一个目录并选择文件 DocumentsPicker IBAction pickD
  • 使用 python 处理 excel 时出错

    当我的脚本同时更新一个 Excel 时 如果我要手动执行任何其他工作 而另一个 Excel 会发生错误 我正在使用调度 from win32com client import Dispatch excel Dispatch Excel Ap
  • Angular:Nodemailer 显示大量运行时错误

    在我的角度项目中 我想使用节点邮件程序发送邮件 第一个问题是当我尝试导入时 我的意思是在执行 npm i save 之后 当我这样做时会发生很多错误ionic serve 我想重复一件事 写完之后import行 这个大错误日志来了 应用程序
  • System.IO.File.Delete() / System.IO.File.Move() 有时不起作用

    Winforms 程序需要将一些运行时信息保存到 XML 文件中 该文件有时可能有几百千字节大小 在 Beta 测试期间 我们发现一些用户会毫不犹豫地看似随机地终止进程 有时会导致文件写入一半并因此损坏 因此 我们更改了算法以保存到临时文件