在Windows服务应用程序中复制文件的一般策略

时间:2011-12-01 11:06:56

标签: c# .net

我需要一个关于如何编写Windows服务应用程序的建议,该应用程序将监视驱动器上某个文件夹的更改,并将更改的和新创建的文件复制到某个位置。现在,我将使用FileSystemWatcher来实现此目的,但我想知道当需要同时复制多个文件时,处理这种情况的最佳方法是什么?例如,仍在复制一个巨大的文件,并再次触发该事件?我是否需要形成某种类型的队列,每当完成一个文件的复制时,启动下一个文件?或者也许为每个文件创建一个新线程并负责该线程中的复制?另外,我应该使用File.Copy方法,还是有更好/更快的方式?

1 个答案:

答案 0 :(得分:1)

我会去排队。队列由事件处理程序填充文件名,后台线程处理队列 如果您使用的是.NET 4,则可以使用ConcurrentQueue<T>并保持线程安全。

非编译示例代码:

class AsyncFileCopier
{
    BackgroundWorker _worker;

    void OnNewFile(string fileName)
    {
        _queue.Enqueue(fileName);
        EnsureWorkerIsRunning();
    }

    void EnsureWorkerIsRunning()
    {
        if(!_worker.IsBusy)
            _worker.RunWorkerAsync();
    }

    void OnWorkerDoWork(...)
    {
        string fileName;
        while(_queue.TryDequeue(out fileName)
        {
            CopyFile(fileName);
        }
    }
}