【问题标题】:How to get open write handles on a file using C#?如何使用 C# 在文件上获取打开的写句柄?
【发布时间】:2010-02-23 17:48:50
【问题描述】:

我正在从客户端计算机复制到共享目录中的服务器计算机。我的服务器检测到新文件,复制完成后它必须处理它。问题是,当写入一个大文件并使用FileSystemWatcher 时,您无法获得复制是否完成的指示。检查这一点的唯一方法是尝试打开文件 (File.OpenRead/OpenWrite) 并获得异常。如何在不使用异常处理作为流控制的情况下获得复制完成的通知?

我的第一个想法是如果我可以检测到用于写入文件的句柄何时关闭,我可以准确地知道复制何时完成,但我不知道该怎么做。

【问题讨论】:

    标签: c# filehandle


    【解决方案1】:

    为什么客户端不能通过 WCF 服务调用(或其他方式)显式通知服务器,而不是使用这种轮询 FileSystemWatcher 的临时通知?你甚至可以制作一个简单的EXE,客户端调用NotifyServerFileUploaded.exe [name of file]

    这样,没有轮询,没有句柄诡计,也没有性能问题。

    【讨论】:

    • 如果他在客户端使用 Windows 资源管理器简单地将文件拖到网络共享中怎么办?
    【解决方案2】:

    将文件复制到临时文件。复制完成后,重命名。重命名是原子的。只需确保服务器计算机忽略临时文件即可。

    【讨论】:

      【解决方案3】:

      您是否尝试过使用 FilesystemWatcher 和 Created 事件?

      myWatcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Security | NotifyFilters.DirectoryName;
      
      
      myWatcher.Created += new FileSystemEventHandler(watcher_Changed);
      

      【讨论】:

        【解决方案4】:

        重试文件以进行独占读取。

        int maxRetry = 3;
        int x = 0;
        tryAgain:
        try
        {
            using (var fs = File.Open("file.txt", FileMode.Open, 
                                                  FileAccess.Read, 
                                                  FileShare.None))
            {
                // you have exclusive read here
            }
        }
        catch (IOException)
        {
            if (x++ > maxRetry)
                throw;
            Thread.Sleep(500);
            goto tryAgain;
        }
        

        【讨论】:

        • 是的...如果您有 goto 恐惧症,您可以使用 while 或 for。
        • (我认为 IOException 是当你没有独占访问权限时抛出的......你可能需要使用不同的异常或只是捕获异常......这取决于你)跨度>
        • 是的,这就是我的想法。这就是我在主题中提出的建议。但是我知道抛出/捕获异常会对应用程序产生不利影响(严重),并且我不希望我的应用程序继续捕获异常。我正在寻找另一种解决方法。
        • 把它放在文件观察器的处理程序中。您也许可以通过平台调用找到一些东西......但我不确定。
        猜你喜欢
        • 2011-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多