文件锁释放时收到通知

2023-12-13

[使用C#和Windows作为平台]

我有一台相机,可以将 JPG 文件写入电脑的本地文件夹中。我想加载相机丢弃的每个文件,因此我有一个 FileSystemWatcher,它会在创建新图片时通知我,但相机在写入文件时锁定文件,所以如果我在收到创建通知后尝试加载它,我会收到一个异常:文件被锁定.

目前,我有一个 while 循环(带有 Thread.Sleep),每 0.2 秒重试一次加载图像,但感觉有点脏。

有没有更优雅的方法来等待锁被释放,这样我就可以加载文件并确保它不再使用?


您将无法绕过试错方法,即尝试打开文件,捕获 IOException,然后重试。但是,您可以将这种丑陋隐藏在单独的类中,如下所示:

public class CustomWatcher
{
    private readonly FileSystemWatcher watcher;
    public event EventHandler<FileSystemEventArgs> CreatedAndReleased;

    public CustomWatcher(string path)
    {
        watcher = new FileSystemWatcher(path, "*.jpg");
        watcher.Created += OnFileCreated;
        watcher.EnableRaisingEvents = true;
    }

    private void OnFileCreated(object sender, FileSystemEventArgs e)
    {
        // Running the loop on another thread. That means the event
        // callback will be on the new thread. This can be omitted
        // if it does not matter if you are blocking the current thread.
        Task.Run(() =>
        {
            // Obviously some sort of timeout could be useful here.
            // Test until you can open the file, then trigger the CreeatedAndReleased event.
            while (!CanOpen(e.FullPath))
            {
                Thread.Sleep(200);
            }
            OnCreatedAndReleased(e);
        });
    }

    private void OnCreatedAndReleased(FileSystemEventArgs e)
    {
        CreatedAndReleased?.Invoke(this, e);
    }

    private static bool CanOpen(string file)
    {
        FileStream stream = null;
        try
        {
            stream = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.None);
        }
        catch (IOException)
        {
            return false;
        }
        finally
        {
            stream?.Close();
        }
        return true;
    }
}

这个“观察者”可以这样使用:

var watcher = new CustomWatcher("path");
watcher.CreatedAndReleased += (o,e) => 
{
    // Now, your watcher has managed to open and close the file,
    // so the camera is done with it. Obviously, any other application
    // is able to lock it before this code manages to open the file.
    var stream = File.OpenRead(e.FullPath);
}

免责声明:CustomWatcher 可能需要 IDisposable 并适当地处置 FileSystemWatcher。该代码仅显示如何实现所需功能的示例。

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

文件锁释放时收到通知 的相关文章

  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • VB.NET 中的静态方法实现

    我很困惑Static在 VB NET 中的实现 在 C 中 我们可以创建静态类和静态方法来为我们的应用程序编写实用方法 现在 VB NET 让我们创建Module代替静态类 如果我们在模块中创建一个方法 默认情况下它会变成静态的 但在我的应
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 在 MAC OSX 和 Ubuntu 上的 F# 中,我在 4.0 中运行 FSI 时出错

    我需要 F 中的 System Numerics EDIT我认为问题是 fsi 可以与 4 0 运行时一起运行吗 如果可以 我该如何配置它 我在 Fsharp 4 0 目录中运行 mono bin Fsi 在 OSX 10 6 4 和 Ub
  • 将键盘表情符号转换为自定义 png,反之亦然

    这是一个直接而简单的问题 我怎样才能实现这两件事 FIRST 输入 嘿我在微笑 输出 hey I m smiling span class smile span 反之亦然 SECOND 输入 嘿我在微笑 smile 输出 嘿我在微笑 现在我
  • 无法在无服务器和 DynamoDB/Cognito/API 网关的 lambda 策略中使用 ${cognito-identity.amazonaws.com:sub}

    客观的 使用 Cognito 进行身份验证 使用下面的 serverless yml 配置 点击经过身份验证的端点 GET users 以触发 lambda 作业 基于IAM策略 限制基于cognito用户查询的DynamoDB表的访问co
  • 比较旋转图像

    我正在寻找一种方法来比较几乎相同 相似度超过 95 但可以绕中心轴旋转的图像 我对整个计算机图形 视觉领域很陌生 不太确定是否有现成的工具或系统 或者即使这是否是正确的堆栈交换 目前 我正在研究使用 C 生成位图直方图 然后通过 Panda
  • VBA:为什么我的 INSERT 代码不起作用?

    几周前我就开始工作了 但现在我不确定我做了什么导致它不再工作了 我什至没有收到错误消息来弄清楚可能出了什么问题 当我单击在表中插入行的按钮时 没有任何反应 表单被清除并重新查询表 但代码的 INSERT 部分不执行任何操作 Public S
  • 如何将文件从一个位置复制到另一个位置?

    我想在 Java 中将文件从一个位置复制到另一个位置 做这个的最好方式是什么 这是我到目前为止所拥有的 import java io File import java io FilenameFilter import java util A
  • Powershell运行时

    我在 Windows 8 下运行 VS 2010 安装 NuGet 并运行包管理器控制台后 我收到以下消息 Error The Package Manager Console requires PowerShell 2 0 runtime
  • 使用猫鼬进行 $lookup

    我有两个集合 例如清单和任务 两个模式如下所示 清单架构如下所示 id 5b7d0f77e231b6b530b0ee5a audit checklist type Weekly id 5b7d3f33e7a57f38084efb09 aud
  • 使用 JavaScript 动态过滤 HTML 表的行

    所以我有这张表 table border 1 align center tr td Broj pu td td Naziv pu td td ID td td Naselje td td zupanija td tr tr td td tr
  • 通过填充空格将字符串居中至指定长度

    我有一个名称向量 如下所示 x lt c Marco John Jonathan 我需要通过添加前导空格和尾随空格对其进行格式化 以便名称以 10 个字符的字符串居中 gt output 1 Marco John Jonathan 我希望有
  • Django - url 的动态视图

    我想根据 url 加载特定视图 例如 url r channel P
  • 如何调用与成员函数同名的内联友元函数?

    如此处所述C 11 风格的 SFINAE 和模板实例化上的函数可见性类成员函数掩盖了自由函数 使用完全限定名称通常是有效的 但是我在使用内联声明的其他类的友元函数时遇到了困难 考虑以下示例 namespace N struct C frie
  • 在 python 中追加到文件后没有 EOL

    我尝试使用以下代码使用 python 附加到文件 with open test txt a as myfile myfile write appended text 问题是 当我用 vim 打开文件时 我在底部收到来自 vim 的消息 te
  • 在 C 中使用 void* 指针的缺点

    使用起来有很多缺点void 在C中 内存相关 类型相关 效率方面 尽管如此 我们还是经常使用它们 因为它们提供了灵活性 列出使用的缺点 缺点void 以及 C 中的首选解决方案 如果可能 EDIT 请访问以下链接 http attracti
  • IIS FTP 是否包含用于检测文件上传何时完成的 API?

    我想使用 IIS FTP 服务器 但我需要能够判断特定用户的文件上传何时完成 我不想依赖于直接在 Windows 中监视文件更改 因为我认为我无法判断文件上传是否真正完成或已中止并且可能稍后完成 您可以使用自定义日志记录提供程序来执行此操作
  • 循环浏览网页并复制数据

    我为一位朋友创建了这个脚本 该脚本循环浏览一个房地产网站并为她获取电子邮件地址 用于促销 该网站免费提供它们 但一次获取一个很不方便 第一个脚本将每个页面的数据转储到名为 webdump 的 txt 文件中 第二个脚本从第一个 txt 文件
  • 如何使用yaml在doctrine2中模拟继承?

    如何以yaml方式声明doctrine2继承 我在学说文档中没有找到任何与此相关的代码片段 示例或食谱文章 当我尝试以doctrine1方式进行操作时 我收到一个错误 指出该实体没有主键 Thanks 尝试使用以下方法进行简单的模型继承ex
  • NVIDIA Fermi 中的 L2 缓存

    在查看NVIDIA Fermi架构中的性能计数器名称 cuda的doc文件夹中的Compute profiler txt文件 时 我注意到对于L2缓存未命中 有两个性能计数器 l2 subp0 read sector misses和l2 s
  • 获取IP地址

    In C IPHostEntry IPHost Dns GetHostEntry Dns GetHostName for int i 0 i lt IPHost AddressList Length i textBox1 AppendTex
  • 文件锁释放时收到通知

    使用C 和Windows作为平台 我有一台相机 可以将 JPG 文件写入电脑的本地文件夹中 我想加载相机丢弃的每个文件 因此我有一个 FileSystemWatcher 它会在创建新图片时通知我 但相机在写入文件时锁定文件 所以如果我在收到