Я использую этот код для мониторинга создания файлов в определенной папке:
_watcher = new RecoveringFileSystemWatcher(SourceFolder, "*.xml");
_watcher.Created += (_, e) =>
{
ProcessFile(e.Name);
};
RecoveringFileSystemWatcher - это обертка fileSystemWatcher.Его конструктор:
public RecoveringFileSystemWatcher (string path, string filter)
{
_containedFSW = new FileSystemWatcher(path, filter);
}
Процесс работает как положено, но для некоторых файлов случайным образом выдается исключение, говорящее о том, что файл используется другим процессом.
Это метод, которыйзапускается при создании файла:
var nfo = new FileInfo(filePath);
if (nfo.Exists)
{
var archivoXml = nfo.Name;
string archivo = String.Empty;
try
{
string content = Task.Run(async () => await GetFileContent(filePath)).Result;
if (String.IsNullOrEmpty(content))
return false;
XmlDocument xml = new XmlDocument();
xml.LoadXml(content);
//The rest of the method
}
}
метод GetFileContent такой:
private async Task<string> GetFileContent(string filePath)
{
string content = String.Empty;
try
{
Console.Write("ONE - "); InfoLog.Save($"ONE {filePath}");
using (StreamReader sr = new StreamReader(filePath))
{
Console.Write("TWO - "); InfoLog.Save($"TWO {filePath}");
content = await sr.ReadToEndAsync().ConfigureAwait(false);
Console.Write($"THREE {(sr.BaseStream == null ? "Closed" : "Opened")} - "); InfoLog.Save($"THREE {(sr.BaseStream == null ? "Closed" : "Opened")} {filePath}");
sr.Close();
Console.WriteLine($"FOUR {(sr.BaseStream == null ? "Closed" : "Opened")}"); InfoLog.Save($"FOUR {(sr.BaseStream == null ? "Closed" : "Opened")} {filePath}");
}
}
catch (Exception ex)
{
InfoLog.Save($"XML file could be read -> {filePath}. See error log.");
ErrorLog.Save(ex);
}
return content;
}
Посмотрите информацию журнала, которую я пишу для отладки процесса.
Iполучил один случай с файлом с именем 1112186.xml .... это записано в журнале:
18/12/2018 19:12:10 ONE D:\GestorDocumental\Origen\1112186.xml
18/12/2018 19:12:10 XML file could not be read -> D:\GestorDocumental\Origen\1112186.xml. See error log.
Как видите, исключение выдается при использовании команды "using".
Если я вижу полный журнал, я вижу, что файл, 1112186.xml, никогда не использовался раньше, поэтому единственный шанс, что FSW сохранит файл открытым.Я не знаю почему, но кажется, что это происходит.
Также ясно, что этот процесс блокирует файл, потому что, когда я выхожу из консольного приложения, а затем снова запускаю, файл может быть обработан.
Любая помощь по этому поводу, пожалуйста?
спасибо Хайме