C # и SystemFileWatcher - несколько файлов - PullRequest
0 голосов
/ 15 мая 2011

Я использую FileSystemWatcher, чтобы посмотреть папку для новых файлов.Когда новый файл копируется в него, он работал хорошо для меня.Однако, если я копирую в 5 файлах (это будет максимум, который я когда-либо делал бы сразу), он срабатывает, но у FileSystemEventArgs есть только один файл.

Мне нужно, чтобы передать все новые файлы.

Есть ли способ заставить его обрабатывать все файлы, а затем я перебираю их?

Вот мой код:

static void Main(string[] args)
{
    FileSystemWatcher fsw = new FileSystemWatcher(FolderToMonitor)
                                {
                                    InternalBufferSize = 10000
                                };
    fsw.Created += new FileSystemEventHandler(fsw_Created);
    bool monitor = true;

    Show("Waiting...", ConsoleColor.Green);
    while (monitor)
    {
        fsw.WaitForChanged(WatcherChangeTypes.All, 2000); // Abort after 2 seconds to see if there has been a user keypress.
        if (Console.KeyAvailable)
        {
            monitor = false;
        }
    }

    Show("User has quit the process...", ConsoleColor.Yellow);
    Console.ReadKey();
}`        

static void fsw_Created(object sender, FileSystemEventArgs args)
{
    Show("New File Detected!", ConsoleColor.Green);
    Show("New file name: " + args.Name, ConsoleColor.Green);

    bool fileIsReadOnly = true;

    while (fileIsReadOnly)
    {
        Thread.Sleep(5000);
        fileIsReadOnly = IsFileReadonly(args.FullPath);

        if (fileIsReadOnly)
            Show("File is readonly... waiting for it to free up...", ConsoleColor.Yellow);
    }
    Show("File is not readonly... Continuing..", ConsoleColor.Yellow);

    HandleFile(args);
}

Ответы [ 2 ]

4 голосов
/ 15 мая 2011

Если я правильно помню, наблюдатель запускает несколько событий, по одному для каждого файла.

Также обратите внимание на это:

Операционная система Windows уведомляет ваш компонент об изменении файла вбуфер, созданный FileSystemWatcher.Если за короткое время произойдет много изменений, буфер может переполниться.Это приводит к тому, что компонент теряет отслеживание изменений в каталоге, и он будет предоставлять только общее уведомление.Увеличение размера буфера с помощью свойства InternalBufferSize является дорогостоящим, так как оно поступает из невыгружаемой памяти, которую нельзя выгружать на диск, поэтому сохраняйте буфер как небольшой, но достаточно большой, чтобы не пропустить какие-либо события изменения файла.Чтобы избежать переполнения буфера, используйте свойства NotifyFilter и IncludeSubdirectories, чтобы можно было отфильтровывать нежелательные уведомления об изменениях.

source: http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

0 голосов
/ 09 марта 2013

Вам нужно сделать два изменения:

  1. Увеличить размер буфера.
  2. EnableRaisingEvents.

См. Модифицированный код ниже:

static void Main(string[] args)
{
FileSystemWatcher fsw = new FileSystemWatcher(FolderToMonitor)
                            {
                                InternalBufferSize = 65536
                            };
fsw.EnableRaisingEvents = true;
fsw.Created += new FileSystemEventHandler(fsw_Created);
bool monitor = true;

Show("Waiting...", ConsoleColor.Green);
while (monitor)
{
    fsw.WaitForChanged(WatcherChangeTypes.All, 2000); // Abort after 2 seconds to see if there has been a user keypress.
    if (Console.KeyAvailable)
    {
        monitor = false;
    }
}
Show("User has quit the process...", ConsoleColor.Yellow);
Console.ReadKey();

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...