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

时间:2010-02-23 17:48:51

标签: c# filehandle

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

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

4 个答案:

答案 0 :(得分:1)

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

这样,就没有轮询,没有处理技巧,也没有执行问题。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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


myWatcher.Created += new FileSystemEventHandler(watcher_Changed);

答案 3 :(得分:0)

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

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