- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 XML 文件格式的应用程序。应用程序可以更改这些 XML 文件,但它还使用 System.IO.FileSystemWatcher 查看程序运行时 XML 文件是否在程序外部发生了更改。如果文件已更改,则应用程序会重新加载 XML 文件。
当然,如果应用程序保存 XML 文件,它会导致 Windows 检测到文件已更改,从而启动 FileSystemWatcher 事件。我不希望文件因为它已启动的更改而重新加载 XML 文件,因此每当它保存 XML 文件时,它都会记录特定文件更改时要忽略的次数。在应用程序中保存 XML 文件会增加计数。如果对文件的更改使用react会减少非零计数,或者如果计数已经为 0 则处理更改。
我遇到的问题是,当我保存 XML 文件时,我是这样做的:
Stream fileStream = null;
if(System.IO.File.Exists(fileToSave)
{
fileStream = System.IO.File.Open(fileName, FileMode.OpenOrCreate | FileMode.Truncate);
}
else
{
fs = System.IO.File.Open(fileName, FileMode.OpenOrCreate);
}
...
然后我使用 XmlWriter 将我的 XML 对象序列化到流中,然后关闭流。一切正常,除了这会导致我在 FileSystemWatcher 中的事件被引发两次。我花了一些时间进行调试,发现使用 Truncate 选项调用 System.IO.File.Open 实际上会更改磁盘上的文件。我在调用它后立即遇到断点,发现 XML 文件在磁盘上,大小为 0 字节。因此,似乎这种方法两次访问磁盘,导致我的 FileSystemWatcher 事件被引发两次。
我该如何解决这个问题?
作为解决方法,我发现我可以删除该文件(如果它存在),然后执行一个简单的 File.Open 而不使用 Truncate 选项,在我的情况下可以解决它......至少到目前为止。我假设这将启动 FileSystemWatcher 上的 Delete 事件。从技术上讲,我不想删除文件,如果我要在以后删除文件时添加特定的逻辑,这段代码可能会导致不正确地触发。
在不引起 2 FileSystemWatcher 事件的情况下更改现有文件的任何其他方法?
我问这个问题已经很多年了,文件监视系统已经成为我在 5 年前问这个问题以来一直使用和维护的应用程序的核心部分。
不幸的是,从那时起我仍然没有找到更好的解决方案来将 XML 序列化到磁盘而不导致 2 个文件监视更改。
对于 future 的读者,这是我正在使用的代码:
if (System.IO.File.Exists(fileName))
{
System.IO.File.Delete(fileName);
}
using( var fs = System.IO.File.Open(fileName, FileMode.OpenOrCreate))
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
using(var writer = XmlWriter.Create(fs, settings))
{
// for info on this, see
// http://stackoverflow.com/questions/1127431/xmlserializer-giving-filenotfoundexception-at-constructor
XmlSerializer serializer = XmlSerializer.FromTypes(new[] { type })[0];
serializer.Serialize(writer, objectToSerialize);
}
}
最佳答案
因此,您遇到的情况是目录中可能会发生更改,并且您希望您的程序对这些更改使用react。这本身是没有问题的。问题是您的程序无法判断是哪个进程在进行更改。因此,如果它更改了该目录中的内容,那么您将陷入无限循环。
您为解决该问题而提出的任何方案都将是脆弱的,因为它会受到竞争条件的影响。您可以尝试设计一种方案,让您忽略您更改的文件的下 N 次更新通知,但在某些时候您会发现某些其他进程进行了您忽略的更新。
要做到这一点,唯一可靠的方法是有两个目录。您有一个 submissions
目录,客户端程序在其中添加文件。您的程序会监视该目录以进行添加。当客户端将文件添加到 submissions
时,您的程序会将文件移动到 repository
目录。客户端对 repository
目录具有只读访问权限。只有您的程序可以在存储库中添加、修改或删除文件。
关于c# - 如何防止 System.IO.File.Open with FileMode.Truncate 导致文件更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8515720/
MySQL 似乎允许 TRUNCATE table_name 并且实际上确实截断了表。似乎存在性能差异,TRUNCATE TABLE table_name 似乎更快。我找不到任何关于差异的信息。我发现
我想避免使用 Aerospike 客户端(例如 Python)并使用 native asinfo 从集合中删除记录命令'truncate'因为它可以快速完成。但在我重新启动 Aerospike 后,所
我缺乏构建存储过程的经验,并且遇到了这个错误,我无法理解背后的原因: [2015-09-29 01:01:55] [22001][1292] Data truncation: Truncated in
这个问题很难用短语来表达,所以让我解释一下。 作为 RSS 缓存系统的一部分,我每天多次将大量行插入到数据库中。其中一列是“片段”,用于 RSS 提要中的 description 节点。 有时这个节点
我想我的标题不是那么清楚。 我会试着解释一下: 我可以使用 FileStream 写入和读取文件 FileStream fs = new FileStream("C:\\Users\\Public\\
我正在尝试优化我的批量加载程序。 目前我分步加载数据(我不遵循下面的 SQL 语法,只遵循算法): BEGIN TRUNCATE table COPY into table ANALYZE table
我正在尝试为我的 Minecraft 服务器编写一个商店插件,但每当有人执行/purchase 命令时我总是收到错误消息。 这是错误: 2012-07-03 04:27:28 [SEVERE]
TRUNCATE TABLE 删除表中的所有行,而不记录单个行删除操作。 语法 ?
备注 与 DELETE 语句相比,TRUNCATE TABLE 具有以下优点: 所用的事务日志空间较少。 DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一个条目。TRUNCA
我最近也遇到了这个问题。当我将表(称为事件和索引)填充到超过 100 万个,并尝试截断它们以进行新测试时,截断后表不为空。 CQL 显示类似 cqlsh> select count(*) from e
如果我尝试截断约 4000 万个文档的大型集合,我会在 arangosh 中超时,并且 arangodb 服务会无响应。留言: arangosh [database_xxx]> db.[collect
我将 spring-data 与 CrudRepository 一起用于任何数据库访问。每天一次,我还必须截断包含大约 100GB 数据的缓存表并重建它。 问题:表被成功截断(我验证表是空的),但是文
这是我正在使用的基于this的sql答案: SET @pattern = '%_movielist'; SELECT concat('TRUNCATE TABLE ', GROUP_CONCAT(co
这是简化的查询。 SELECT `a`, TRUNCATE(`b` / 1000, 3) AS `b` FROM ( ... ) AS `m`
我使用的 MySQL 服务器是 5.5.41。我还想指出,我没有设计这个数据库。 我遇到的问题是,在使用 MySQL 的 TRUCATE 函数时,我似乎因一个错误而中断。因为它不准确。请参阅随附的屏幕
Truncate table语句用来删除/截断表里的所有数据 和delete删除所有表数据在逻辑上含义相同,但性能更快 类似执行了drop table和create table两个语句
前言 上周同事小姐姐问我:“哈哥你看,我发现MySQL有bug,我下午为了清理磁盘,明明删除了100万条MySQL数据,磁盘不仅没有变小,反而更满了呢??” 那你是怎么删除的?
本文主要讲mysql中三种删除表的操作,delete语句、truncate语句以及drop语句的区别: 简介 delete 1、删除整张表的数据: ?
不同点: 1.truncate和delete只删除数据不删除表的结构(定义) drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index);依赖于该
SQLite Truncate Table 在SQLite 中,并没有 TRUNCATE TABLE 命令,但可以使用 SQLite 的 DELETE 命令从已有的表中删除全部的数据,但建议使用 D
我是一名优秀的程序员,十分优秀!