Я думаю, это потому, что вы используете mode tcp
, но option http-keep-alive
- это опция mode http
. В этом случае, скорее всего, будет использовано любое значение, которое у вас есть для timeout client
или timeout server
, перед тем как разорвать соединение.
Подробнее о option http-keep-alive
и mode http
см .:
Типичная проблема этого подхода состоит в том, что файл все еще копируется, в то время как событие инициировано. Очевидно, Вы получите исключение, потому что файл заблокирован во время копирования. Исключение особенно вероятно на больших файлах.
Как обходное решение Вы могли сначала скопировать файл и затем переименовать его и слушать событие переименования.
Или другая опция состояла бы в том, чтобы иметь некоторое время цикл, проверяющий, может ли файл быть открыт с доступом для записи. Если это может Вы знать, что копирование было завершено. Код 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 слушал бы триггерный файл только.
Когда вы открываете файл в методе OnChanged, вы указываете FileShare.None
, что, согласно документации , вызовет любой другой пытается открыть файл, пока он открыт. Поскольку все, что вы (и ваш наблюдатель) делаете, это читаете, попробуйте вместо этого использовать FileShare.Read
.
У меня была такая же проблема в DFS. Мое разрешение было достигнуто путем добавления двух пустых строк в каждый файл. Затем мой код ожидает двух пустых строк в файле. Тогда я уверен, что прочитал все данные из файла.