#c# #powershell #.net-core
#c# #powershell #.net-core
Вопрос:
В настоящее время мне нужно просканировать папку в приложении c # на наличие файлов, соответствующих шаблону, такому как RecordID * .* В настоящее время в папке содержится несколько сотен тысяч файлов, и мы не можем это изменить, по крайней мере, на данный момент.
Выполнение этого:
var folderPath = @"\serverfolder";
var options = new EnumerationOptions()
{
BufferSize = 64000,
RecurseSubdirectories = false,
MatchType = MatchType.Simple,
MatchCasing = MatchCasing.CaseInsensitive
};
var searchPattern = $"{request.RecordId}*.*";
var isMediaFileInFolder = _fileSystem.Directory
.EnumerateFiles(folderPath, searchPattern, options);
Возврат списка найденных файлов займет около 10 минут.
Однако мы можем запустить это в PowerShell ISE, и оно выполняется менее чем за секунду.
$Directory = "\serverfolder"
$Filter = "REC1234*.*"
Get-ChildItem -Path $Directory -Filter $Filter
Я попытался запустить powershell в c # с помощью чего-то вроде этого:
public static List<string> PSFiles(string path, string pattern)
{
try
{
ICollection<PSObject> collection = null;
List<string> returnStrings = new List<string>();
script = "Get-ChildItem -Path " path " -Filter" pattern;
using (PowerShell powerShell = PowerShell.Create())
{
powerShell.AddScript(script);
collection = powerShell.Invoke();
}
foreach (PSObject obj in collection)
{
if (!String.IsNullOrEmpty(obj.ToString()))
{
foreach(var i in Regex.Split(obj.ImmediateBaseObject.ToString().Trim(), "rn"))
{
returnStrings.Add(i.Trim());
}
}
}
return returnStrings;
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
И для запуска потребовалось больше времени, чем попытка перечисления файлов, при этом почти все время было потрачено на PowerShell.Invoice(); шаг.
После тестирования в Powershell Core это также занимает более 10 минут. Далее, используя каталог.EnumerateFiles() в .NET заняла менее секунды.
Итак, вопрос в том, есть ли способ отразить производительность перечисления файлов внутри.NET при запуске на .NET Core?
Комментарии:
1. Powershell работает на .NET, а Powershell Core — на .NET Core. Если вы хотите сравнить производительность с .NET Core, попробуйте выполнить эту команду в Powershell Core. Также попробуйте без указания каких-либо параметров. По умолчанию подкаталоги не повторяются
2. Попробуйте повторить тесты несколько раз, в другом порядке. Я подозреваю, что вторая попытка всегда выполняется быстрее, потому что первая заставила ОС кэшировать содержимое папки
3. @PanagiotisKanavos спасибо. Я не знал о Powershell Core. Я установил это, запустил скрипт, и он работал с той же производительностью, что и при запуске скрипта внутри объекта Powershell в c #. Так что, похоже, это несоответствие .NET Core и .NET.NET. Я несколько раз запускал оба теста и Powershell. NET занимает менее секунды по сравнению с .NET Core в течение 10 минут.
4. @DavidJacobsen Итак, вы выполнили точно такую же команду в
Windows Powershell
(powershell.exe ) окно, а также вPowershell Core
(pwsh.exe ) окно, несколько раз, иPowershell Core
было последовательно медленнее?5. @ChadBaldwin правильно. Я также создал приложение .NET, используя Directory . Перечислите файлы, и для возврата списка файлов потребовалось меньше секунды. Похоже, это разница в том, как выполняется перечисление файлов между .Net Core и .Net