private void BuildPartitionStructure(ContentNodeSitecoreItem product) { var guidAsString = product.Id.Guid.ToString("N").ToUpper(CultureInfo.InvariantCulture); FolderItem parent = Root; for (int i = 0; i < PartitionDepth; i++) { var bucketIndex = guidAsString.Substring(0, i + 1); if (!_bucketFolders.ContainsKey(bucketIndex)) { var folder = new BucketFolderItem(new ID(Root.Id.Guid.Derived(bucketIndex)), bucketIndex); _bucketFolders[bucketIndex] = folder; _sitecoreItems[folder.Id] = folder; parent.AddItem(folder); } parent = _bucketFolders[bucketIndex]; } parent.AddItem(product); }
protected void Refresh(RefreshFiles[] refreshFiles, CancellationToken token) { CanDisplayProgress = rootItem.Type == FileItemType.Volume || (rootItem.Type == FileItemType.Computer && !rootItem.Children.Any(f => f.Type != FileItemType.Volume && f.Type != FileItemType.FreeSpace && f.Type != FileItemType.Unknown)); if (CanDisplayProgress) { if (rootItem.Type == FileItemType.Volume) { try { if (rootItem.CheckExists()) { DriveInfo driveInfo = new DriveInfo(rootItem.RootPath); TotalSize = driveInfo.TotalSize; TotalFreeSpace = driveInfo.TotalFreeSpace; } else { CanDisplayProgress = false; } } catch { CanDisplayProgress = false; } } else if (rootItem.Type == FileItemType.Computer) { bool anySuccess = false; foreach (FileItemBase child in rootItem.Children) { if (child is RootItem root) { try { if (root.CheckExists()) { DriveInfo driveInfo = new DriveInfo(root.RootPath); TotalSize += driveInfo.TotalSize; TotalFreeSpace += driveInfo.TotalFreeSpace; anySuccess = true; continue; } } catch { } TotalSize += root.CachedTotalSize; TotalFreeSpace += root.CachedFreeSpace; } } if (!anySuccess) { CanDisplayProgress = false; } } } // Reset the progress if applicable TotalScannedSize = Extensions.TotalSize - refreshFiles.Sum(rf => rf.Files.Sum(f => f.Size)); ProgressState = ScanProgressState.Started; foreach (RefreshFiles refresh in refreshFiles) { FolderItem parent = refresh.Parent; FolderItem fileCollection = parent.GetFileCollection(); Queue <FolderItem> subdirs = new Queue <FolderItem>(); foreach (FileItemBase refreshChild in refresh.Files) { if (!refreshChild.Refresh()) { string fullName = refreshChild.FullName; parent.RemoveItem(refreshChild, ref fileCollection); // See if the type changed (file <-> directory) FileItemBase child = null; if (refreshChild.Type == FileItemType.File) { DirectoryInfo info = new DirectoryInfo(fullName); if (info.Exists) { FolderItem folder = new FolderItem(info); child = folder; // Folder exists enqueue it for scanning if (!info.Attributes.HasFlag(FileAttributes.ReparsePoint)) { subdirs.Enqueue(folder); } } } else if (refreshChild.Type == FileItemType.Directory) { FileInfo info = new FileInfo(fullName); if (info.Exists) { ExtensionItem extension = Extensions.GetOrAddFromPath(fullName); FileItem file = new FileItem(info, extension); child = file; // File exists, add it to the scanned size if (!info.Attributes.HasFlag(FileAttributes.ReparsePoint)) { TotalScannedSize += child.Size; } } } if (child != null) { FileItem firstFile = parent.GetFirstFile(); parent.AddItem(child, ref fileCollection, ref firstFile); } } else if (!refreshChild.IsReparsePointFile) { // Folder exists enqueue it for scanning if (refreshChild is FolderItem folder) { subdirs.Enqueue(folder); } // File exists, add it to the scanned size else { TotalScannedSize += refreshChild.Size; } } if (AsyncChecks(token)) { return; } } if (subdirs.Count > 0) { RefreshFolders(subdirs, token); } if (AsyncChecks(token)) { return; } } }
public void AddSitecoreItem(ISitecoreItem sitecoreItem) { _topUcommerceFolder.AddItem(sitecoreItem); AddItemsToDictionary(sitecoreItem); }
private void ReadNative(Queue <FolderState> subdirs, CancellationToken token) { Win32FindData find = new Win32FindData(); FolderState folderState = subdirs.Dequeue(); ScanningState state = folderState.State; FolderItem parent = folderState.Folder; bool findResult; string parentPath = parent.FullName; string searchPattern = PathUtils.CombineNoChecks(parentPath, "*"); if (!searchPattern.StartsWith(@"\\?\")) { searchPattern = @"\\?\" + searchPattern; } IntPtr hFind = FindFirstFileEx(searchPattern, FindExInfoLevels.Basic, out find, FindExSearchOps.NameMatch, IntPtr.Zero, FindExFlags.LargeFetch); if (hFind == InvalidHandle) { return; } FolderItem fileCollection = null; FileItem firstFile = null; bool subdirsAdded = false; try { do { string filePath = PathUtils.CombineNoChecks(parentPath, find.cFileName); if (find.IsRelativeDirectory || SkipFile(state, find.cFileName, filePath)) { // Skip these types of entries findResult = FindNextFile(hFind, out find); continue; } FileItemBase child; if (find.IsDirectory) { FolderItem folder = new FolderItem(new WindowsScanFileInfo(find, filePath)); child = folder; if (!find.IsSymbolicLink) { subdirsAdded = true; subdirs.Enqueue(new FolderState(folder, state)); } } else { ExtensionItem extension = Extensions.GetOrAddFromPath(filePath); FileItem file = new FileItem(new WindowsScanFileInfo(find, filePath), extension); child = file; if (!find.IsSymbolicLink) { TotalScannedSize += child.Size; } } parent.AddItem(child, ref fileCollection, ref firstFile); if (AsyncChecks(token)) { return; } findResult = FindNextFile(hFind, out find); } while (findResult); if (!subdirsAdded) { parent.Finish(); } //if (parent.IsWatched) // parent.RaiseChanged(FileItemAction.ChildrenDone); } finally { FindClose(hFind); } }