Exemplo n.º 1
0
        public void Deduplication()
        {
            var changedItems = new List <int>();
            var items        = _index.Items
                               .Where(item => _driver.Exists(item.FileName))
                               .ToDictionary(item => item, item => _driver.GetLength(item.FileName));

            var length = items.Count;

            for (int i = 0; i < length; i++)
            {
                if (changedItems.Contains(i))
                {
                    continue;
                }
                var item1 = items.ElementAt(i);

                using (var s1 = _driver.Read(item1.Key.FileName))
                {
                    for (int j = i + 1; j < length; j++)
                    {
                        if (changedItems.Contains(j))
                        {
                            continue;
                        }

                        var item2 = items.ElementAt(j);

                        if (item1.Value != item2.Value)
                        {
                            continue;
                        }

                        using (var s2 = _driver.Read(item2.Key.FileName))
                        {
                            if (!FileStreamEquals.Equals(s1, s2))
                            {
                                continue;
                            }
                        }

                        _driver.Remove(item2.Key.FileName);
                        item2.Key.FileName = item1.Key.FileName;

                        changedItems.Add(j);
                    }
                }
                _index.Save();
            }
            _index.Save();
        }