Ошибка доступа к файлу с FileSystemWatcher, когда несколько файлов добавляются к каталогу

Я думаю, это потому, что вы используете mode tcp, но option http-keep-alive - это опция mode http. В этом случае, скорее всего, будет использовано любое значение, которое у вас есть для timeout client или timeout server, перед тем как разорвать соединение.

Подробнее о option http-keep-alive и mode http см .:

https://www.haproxy.com/documentation/aloha/7-5/traffic-management/lb- layer7 / HTTP-режимы / # HTTP-мода-в-HAProxy

38
задан abatishchev 1 February 2013 в 07:09
поделиться

3 ответа

Типичная проблема этого подхода состоит в том, что файл все еще копируется, в то время как событие инициировано. Очевидно, Вы получите исключение, потому что файл заблокирован во время копирования. Исключение особенно вероятно на больших файлах.

Как обходное решение Вы могли сначала скопировать файл и затем переименовать его и слушать событие переименования.

Или другая опция состояла бы в том, чтобы иметь некоторое время цикл, проверяющий, может ли файл быть открыт с доступом для записи. Если это может Вы знать, что копирование было завершено. Код C# мог быть похожим на это (в производственной системе, Вы могли бы хотеть иметь максимальное количество повторений или тайм-аута вместо a while(true)):

/// <summary>
/// Waits until a file can be opened with write permission
/// </summary>
public static void WaitReady(string fileName)
{
    while (true)
    {
        try
        {
            using (Stream stream = System.IO.File.Open(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                if (stream != null)
                {
                    System.Diagnostics.Trace.WriteLine(string.Format("Output file {0} ready.", fileName));
                    break;
                }
            }
        }
        catch (FileNotFoundException ex)
        {
            System.Diagnostics.Trace.WriteLine(string.Format("Output file {0} not yet ready ({1})", fileName, ex.Message));
        }
        catch (IOException ex)
        {
            System.Diagnostics.Trace.WriteLine(string.Format("Output file {0} not yet ready ({1})", fileName, ex.Message));
        }
        catch (UnauthorizedAccessException ex)
        {
            System.Diagnostics.Trace.WriteLine(string.Format("Output file {0} not yet ready ({1})", fileName, ex.Message));
        }
        Thread.Sleep(500);
    }
}

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

52
ответ дан 27 November 2019 в 03:33
поделиться

Когда вы открываете файл в методе OnChanged, вы указываете FileShare.None , что, согласно документации , вызовет любой другой пытается открыть файл, пока он открыт. Поскольку все, что вы (и ваш наблюдатель) делаете, это читаете, попробуйте вместо этого использовать FileShare.Read .

4
ответ дан 27 November 2019 в 03:33
поделиться

У меня была такая же проблема в DFS. Мое разрешение было достигнуто путем добавления двух пустых строк в каждый файл. Затем мой код ожидает двух пустых строк в файле. Тогда я уверен, что прочитал все данные из файла.

0
ответ дан 27 November 2019 в 03:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: