文件锁释放时收到通知

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(使用前将#替换为@)

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

  • 将 void* 作为函数调用而不声明函数指针

    我已经搜索过 但找不到任何结果 我的术语可能有问题 所以如果以前有人问过这个问题 请原谅我 我想知道是否有一种简单的方法可以调用void 作为 C 中的函数 无需首先声明函数指针 然后为函数指针分配地址 IE 假设要调用的函数是类型void
  • 初始化影子变量

    标准中是否有任何内容定义从它隐藏的变量初始化变量 例如 int i 7 int i i Visual Studio 2013 允许这样做而不发出警告并按预期工作 内在i变量是 7 然而 Clang 和 GCC 给我一个警告 关于从自身初始化
  • 如何在 javascript 中使用 .net 资源文件

    无论如何 我可以在 javascript 中访问我的资源文件 resx 吗 如果没有 那么是否有任何解决方法可以用不同语言的 javascript 显示消息 如果您的 javascript 在页面中 您可以使用 var globalReso
  • lua_resume 的 from 参数的含义

    From Lua 5 2 参考手册 http www lua org manual 5 2 manual html lua resume int lua resume lua State L lua State from int nargs
  • 如果文本框不为空,如何添加并显示工具提示文本框 WPF

    需要显示提示 其中包含文本字段中的数据 文本框有数据时出现提示 只需使用绑定到 ToolTipService 附加属性即可 XAML
  • 使用 Mono Cecil 添加 try-catch

    我正在使用 Mono Cecil 在另一个方法中注入代码 我想在我的代码周围添加一个 Try Catch 块 所以我写了一个带有 try catch 块的 HelloWorld exe 并反编译了它 Try Catch 的 Reflecto
  • 使用 JsonWriter 时,WriteStartConstructor 的用途是什么?

    标题说明了一切 我看到它 及其相应的结尾 吐出以下内容 new Foo 但我不明白什么new实际上是在反序列化时执行的 文档只是说它编写了一个 Json 构造函数 但没有说 Json 构造函数是什么is 此方法是作为增强功能的一部分引入的
  • MDI应用程序中父窗体的问题

    我使用按钮作为容器中的控件 父窗体 当子窗体出现时 父窗体中的控件 按钮 图片 标签 出现在子窗体上并将其覆盖 我看不到子窗体 有谁知道如何防止这种情况 我不想将这些控件设置为 Control Visible false 因为当我最小化子表
  • 接收UDP数据包

    假设我的程序通过网络 UDP 发送 1000 字节 它是否保证接收方将 一批 接收 1000 个字节 或者他可能需要执行多次 读取 直到收到完整的消息 如果后者为真 我如何确保同一消息的数据包顺序不会 混淆 按顺序 或者协议可能保证这一点
  • C++ 中“return *this”是什么意思?

    我正在将 C 程序转换为 C 但这部分让我感到困惑 return this 是什么意思 template lt EDemoCommands msgType typename PB OBJECT TYPE gt class CDemoMess
  • 如何在MVVM架构中将animationview play与LottieForms绑定?

    所以我在列表视图中处理动画 并且我想随时播放一次 所以我想控制它 这是图书馆https github com martijn00 LottieXamarin https github com martijn00 LottieXamarin
  • MVC Razor for 循环

    我有这段代码 嵌套在表单帖子内 但我不断收到错误 它缺少结束语 for int i 0 i lt itemsCount i
  • dev_t 和 ino_t 是否必须是整数类型?

    glibc 的文档保留它们是整数类型 不比 unsigned int 窄 但我没有找到说明它们必须是整数类型的标准参考 另请参阅 time t 所以最后 问题就变成了 include
  • 如何在 C# 中获取包含表情符号的字符串的正确长度

    The 英语国旗表情符号 https emojipedia org flag for england 由 14 个字节的数据组成 组合后将呈现一个字符 如果我有如下所示的代码 var test ud83c udff4 udb40 udc67
  • 何时使用 const char * 何时使用 const char[]

    我知道它们是不同的 我知道它们有何不同 并且我阅读了我能找到的所有关于char vs char 但所有这些答案都没有告诉我们什么时候应该使用它们 所以我的问题是 你什么时候使用 const char text text 你什么时候使用 co
  • 显式调用静态构造函数

    我想为下面的课程编写单元测试 如果名称不是 MyEntity 则 mgr 应为空 消极的单元测试 使用 Manager 私有访问器 我想将名称更改为 Test 以便 mgr 应该为空 然后会验证 mgr 值 为了实现这一点 我想显式调用静态
  • 引用计数类和多线程

    我是多线程编程的新手 对此我仍然感到困惑 下面是我的引用计数类 class Rbuffer private char m pnData volatile unsigned int mRefCount public Rbuffer int n
  • 生成唯一随机数的智能方法

    我想生成 00000001 到 99999999 范围内的唯一随机数序列 所以第一个可能是 00001010 第二个可能是 40002928 等等 最简单的方法是生成一个随机数并将其存储在数据库中 下次再执行一次并检查数据库中该数字是否已存
  • Phong 着色问题

    我正在根据以下内容编写着色器冯模型 http en wikipedia org wiki Phong reflection model 我正在尝试实现这个方程 其中 n 是法线 l 是光线方向 v 是相机方向 r 是光反射 维基百科文章中更
  • 为什么 typeof 函数在 C 中不起作用

    我使用GCC编译器 版本9 2 0 我想在 C 中使用 typeof 函数 但它会引发错误 错误 typeof 之前的预期表达式 如果您需要更多信息 请询问我 int a 5 double b the expected result is

随机推荐

  • 在 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 它会在创建新图片时通知我 但相机在写入文件时锁定文件 所以如果我在收到