#c# #directory #share
#c# #каталог #Поделиться
Вопрос:
У меня создалось впечатление, что методы класса Directory GetDirectories() и Exists() всегда получают текущую ситуацию в каталоге. Но почему-то это кажется неверным для общих файловых ресурсов.
Я восстанавливаю сложную фоновую службу, которая автоматически копирует файлы из локального каталога в общий ресурс. Все работает просто отлично, пока я не касаюсь файлов в общем ресурсе.
По какой-то причине, когда я удаляю файлы в общем доступе назначения, GetDirectories() и Exist() сообщают службе, что они уже есть, но это не так.
Приведенный ниже код представляет собой рекурсивную процедуру, которая создает целевые каталоги в том же порядке, что и исходные. Но иногда это просто не так. Я протестировал регулярные выражения, которые определяют определенные условия, и пришел к выводу, что они работают так, как ожидалось, поэтому один из .Свойства успеха правильно истинны. Это не то, где он терпит неудачу. Путь также не содержит строк ‘Quant ….’. Поэтому он всегда должен создавать каталоги.
Я пытался воспроизвести это локально, но не могу. Это происходит только на рабочем сервере после удаления файлов из целевого общего ресурса.
Единственный вывод, который я могу сделать, это то, что информация каталога для общего ресурса где-то кэшируется. Если я остановлю службу, удалите файлы и запустите службу снова. Все работает отлично. Если я удаляю файлы во время работы службы, она вылетает во время копирования с этим исключением:
Не удалось найти часть пути ‘\wurdfs-rootPROJECTSESG_ERA_GLPD01542341NONGLP2020cpf2020.okt26cpf001.dAcqData-CumulativeAuditTrail.xml’.
потому что часть directorystructure не была создана. Если я посмотрю в пункте назначения, каталог, начинающийся с «2020.okt26», не был создан.
private void CreateFolders(string sourcePath, string destinationPath)
{
foreach (string dirPath in Directory.GetDirectories(sourcePath))
{
try
{
var destFolder = (destinationPath dirPath.Remove(0, _sourceRootFolder.Length));
if (!destFolder.HasRootLocks(destinationPath))
{
Match isGlpFolder = glpFolders.Match(dirPath);
Match isNonGLPFolder = nonglpFolders.Match(dirPath);
Match isNonGLPRootFolder = destNonglpRootFolders.Match(destFolder);
Match isGLPRootFolder = destGlpRootFolders.Match(destFolder);
destFolder = (destinationPath dirPath.Remove(0, _sourceRootFolder.Length));
if ((isGlpFolder.Success || isNonGLPFolder.Success)
amp;amp; !dirPath.Contains("QuantResults")
amp;amp; !dirPath.Contains("QuantReports"))
{
if (!Directory.Exists(destFolder))
{
var di = Directory.CreateDirectory(destFolder);
if (isGLPRootFolder.Success)
{
SetDirSec(destFolder, glpAccessRule, true);
}
if (isNonGLPRootFolder.Success)
{
SetDirSec(destFolder, nonglpAccessRule, true);
}
}
Match isQuantFolder = quantFolders.Match(destFolder);
if (isGlpFolder.Success amp;amp; isQuantFolder.Success)
{
Directory.CreateDirectory($"{destFolder}\QuantResults");
Directory.CreateDirectory($"{destFolder}\QuantReports");
}
}
#if EXTRAINFO
else
{
Log.Info($"Did not create folder: {destFolder} GLP?:{isGlpFolder.Success} NONGLP?:{isNonGLPFolder.Success}");
}
#endif
}
CreateFolders(dirPath, destinationPath);
}
catch (UnauthorizedAccessException ex)
{
_glpDebugger.DebugMessage($"Fout bij folder {dirPath}. Error: {ex.Message}", true, true, false);
Log.Info($"CreateFolders: {ex.MessageEx()}");
continue;
}
catch (Exception ex)
{
_glpDebugger.DebugMessage($"Fout bij folder {dirPath}. Error: {ex.Message}", true, true, false);
Log.Info($"CreateFolders: {ex.MessageEx()}");
continue;
}
finally
{
//continue on error
}
}
}
Комментарии:
1. Сетевой путь… Я не думаю, что .net кэширует данные, более вероятно, что Windows кэширует их.
2. Да, это тоже возможно. Есть ли способ очистить этот кеш?