如何使用C#在文件上打开写句柄?

如何使用C#在文件上打开写句柄?,c#,filehandle,C#,Filehandle,我正在从客户端计算机复制到共享目录中的服务器计算机。我的服务器检测到新文件,复制完成后必须对其进行处理。问题是,当编写一个大文件并使用FileSystemWatcher时,您不会得到是否完成复制的指示。检查此问题的唯一方法是尝试打开文件(file.OpenRead/OpenWrite)并获取异常。我如何才能在不诉诸异常处理(如流控制)的情况下获得副本已完成的通知 我的第一个想法是,如果我能检测到用于写入文件的句柄何时关闭,我就可以准确地知道复制何时完成,但我不知道该如何做。为什么客户端不能通过W

我正在从客户端计算机复制到共享目录中的服务器计算机。我的服务器检测到新文件,复制完成后必须对其进行处理。问题是,当编写一个大文件并使用
FileSystemWatcher
时,您不会得到是否完成复制的指示。检查此问题的唯一方法是尝试打开文件(
file.OpenRead
/
OpenWrite
)并获取异常。我如何才能在不诉诸异常处理(如流控制)的情况下获得副本已完成的通知


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

为什么客户端不能通过WCF服务调用(或其他)显式地通知服务器,而不是使用轮询FileSystemWatcher的临时通知?您甚至可以创建一个简单的EXE,客户端调用它
notifyserverfileupload.EXE[文件名]


这样,就不会出现轮询、句柄欺骗和性能问题。

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

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

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;
}

您是否尝试过使用FilesystemWatcher和创建的事件

myWatcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Security | NotifyFilters.DirectoryName;


myWatcher.Created += new FileSystemEventHandler(watcher_Changed);

如果在客户端上,他使用Windows资源管理器简单地将文件拖动到网络共享,会怎么样?是的。。。如果你有goto恐惧症,你可以使用一段时间或一个for(我认为IOException是当你没有独占访问权限时抛出的…你可能需要使用不同的异常或只是捕获异常…这取决于你)是的,这就是我的想法。这就是我在主题中提出的。但我知道抛出/捕获异常会对应用程序造成不良影响(严重),我不希望我的应用程序继续捕获异常。我正在寻找另一种解决方法。把它放在文件监视程序的处理程序中。您可以通过平台调用找到一些内容。。。但我不确定。