コード例 #1
0
        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;
                }
            }
        }
コード例 #3
0
 public void AddSitecoreItem(ISitecoreItem sitecoreItem)
 {
     _topUcommerceFolder.AddItem(sitecoreItem);
     AddItemsToDictionary(sitecoreItem);
 }
コード例 #4
0
        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);
            }
        }