in AdlsDotNetSDK/FileProperties/Jobs/EnumerateAndGetPropertyJob.cs [8:76]
protected override object DoJob()
{
if (_manager.GetAclProperty)
{
_currentNode.Acls = _manager.Client.GetAclStatus(_currentNode.FullPath);
}
if (_currentNode.Type == DirectoryEntryType.DIRECTORY)
{
var fop = _manager.Client.EnumerateDirectory(_currentNode.FullPath);
foreach (var dir in fop)
{
if (dir.Type == DirectoryEntryType.DIRECTORY)
{
_currentNode.ChildDirectoryNodes.Add(new PropertyTreeNode(dir.FullName, dir.Type, dir.Length,
_currentNode, _manager.GetAclProperty || _manager.DisplayFiles));
_currentNode.DirectChildDirec++;
}
else
{
_currentNode.DirectChildSize += dir.Length;
_currentNode.DirectChildFiles++;
// We need to add files to list only if user has specified DisplayFiles
if (_manager.DisplayFiles)
{
_currentNode.ChildFileNodes.Add(
new PropertyTreeNode(dir.FullName, dir.Type, dir.Length, _currentNode));
}
}
}
if (_manager.GetSizeProperty)
{
_currentNode.TotChildSize += _currentNode.DirectChildSize;
_currentNode.TotChildDirec += _currentNode.DirectChildDirec;
_currentNode.TotChildFiles += _currentNode.DirectChildFiles;
}
// Add the jobs for child nodes after we have enumerated all the sub-directories to be threadsafe
foreach (var childNode in _currentNode.ChildDirectoryNodes)
{
_manager.ConsumerQueue.Add(new EnumerateAndGetPropertyJob(childNode, _manager));
}
// REMEMBER if user has not specified DISPLAYFILES we would not compute ACL for the file
// _currentNode.ChildFileNodes will be empty if user has not passed DisplayFiles
// Reason is there can be millions of files and there will be unnecessary delay in getting Acls even though user does not want acl of files
if (_manager.GetAclProperty)
{
foreach (var childNode in _currentNode.ChildFileNodes)
{
_manager.ConsumerQueue.Add(new EnumerateAndGetPropertyJob(childNode, _manager));
}
}
}
// Putting this outside because input can be a file also
// If it is the root node then enter here. If the input is a file then it will exit before updating the parent property
if (_currentNode.DepthLevel == 0)
{
// For only disk usage (no getacl) if no subdirectories then end
// for getacl if there are no sub directories and sub files then only end
if (!_manager.GetAclProperty && _currentNode.ChildDirectoryNodes.Count == 0 || (_manager.GetAclProperty && _currentNode.NoChildren()))
{
_manager.ConsumerQueue.Add(new PoisonJob());
}
return null;
}
UpdateParentProperty(_currentNode, true);
return null;
}