Удаление файлов с одинаковым размером c#

  • Автор темы Автор темы crypton
  • Дата начала Дата начала

crypton

Client
Регистрация
04.09.2010
Сообщения
8
Реакции
0
Баллы
1
Помогите пожалуйста сделать снипет который будет удалять в директории дубли файлов с одинаковым размером. С кубиками сложная и долгая конструкция получается (

Снипет определения размера файла есть
Код:
Развернуть Свернуть Копировать
var size = new FileInfo(project.Variables["razmer"].Value);
return size.Length;
 
Помогите пожалуйста сделать снипет который будет удалять в директории дубли файлов с одинаковым размером. С кубиками сложная и долгая конструкция получается (

Снипет определения размера файла есть
Код:
Развернуть Свернуть Копировать
var size = new FileInfo(project.Variables["razmer"].Value);
return size.Length;

Код:
Развернуть Свернуть Копировать
var list = project.Lists["list"];
List<string> temp = new List<string>();
for(int i = 0;i<list.Count;i++)
{
string size = Convert.ToString(new FileInfo(list[i]).Length);
    if(temp.Contains(size))
    {
        System.IO.File.Delete(list[i]);
    }
    else
    {
    temp.Add(size);
    }
}

Как то примерно так.
 
Последнее редактирование:
  • Спасибо
Реакции: crypton
List<string> temp = List<string>;
а что в этом списке и с чем там идёт сравнение ?
 
сам удивился такому листу, обычно создается новый или приравнивается к какому-то листу
 
Исправил. В него записываются размеры, которые уже были для дальнейшего сравнения.
 
Исправил. В него записываются размеры, которые уже были для дальнейшего сравнения.

Поправьте меня пожалуйста, если я где то ошибся, с шарпом до сегодняшнего дня дел практически не имел )

Код:
Развернуть Свернуть Копировать
var list = project.Lists["list"];                                        - это список list с путями к файлам
List<string> temp = new List<string>();                        - тут создается массив temp
for(int i = 0;i<list.Count;i++)                                        - это цикл который берет поочереди пути к файлам из списка list
string size = Convert.ToString(new FileInfo(list[i]).Length); - тут определяется размер файла из списка list
if(temp.Contains(size))                                               - тут условие если в списке temp есть совпадение размера
{
System.IO.File.Delete(list[i]);                                       - то файл удаляем
}
else
{
temp.Add(size);                                                        - иначе записываем размер в temp
}}

Снипет отрабатывает без ошибок, но с файлами ничего не происходит (
Может слеши в путях нужны обратные или скобки в названиях файлов надо убирать?
 
В списке должны быть полные пути к файлам.
слеши обычные - C:\файл.txt
Не знаю в чем у Вас дело, возможно файлы не идеально одинаковые? Если они отличаются хоть на байт, этим кодом их не удалишь.
Возможно, что пытаетесь работать с системными папками. Если так, то перенесите папку проекта на диск Д, проверьте там.
Проверил у себя - создал десяток копий одного файла, в результате остался один.
 
Вы кстати код неправильно скопировали. Там одной скобки не хватает и как результат в цикл не заходит.
 
Точно! Видимо скобку упустил, все работает, огромное вам спасибо!
 
@ZennoScript Приветствую! Подскажи пожалуйста, как удалить дубли файлов в папке?
Пример: logo, logo(1), logo(2) и тд. Надо что бы осталось только logo.
 
@ZennoScript Приветствую! Подскажи пожалуйста, как удалить дубли файлов в папке?
Пример: logo, logo(1), logo(2) и тд. Надо что бы осталось только logo.

Ищите файлы по маске.
Берёте имя файла logo, получаете список файлов по маске logo* , после чего удаляете. Как то так наверное?
Можно получить полностью весь список файлов в папке, после чего удалить строки, не соответствующие регулярному выражению - \(\d+\) Таким образом удаляться все пути к файлам типа logo. Всё. Берёте по одной строке и удаляете все файлы.
 
Ищите файлы по маске.
Берёте имя файла logo, получаете список файлов по маске logo* , после чего удаляете. Как то так наверное?
Можно получить полностью весь список файлов в папке, после чего удалить строки, не соответствующие регулярному выражению - \(\d+\) Таким образом удаляться все пути к файлам типа logo. Всё. Берёте по одной строке и удаляете все файлы.
А как удалить файлы с одинаковым содержимым, а не размером?
 
А как удалить файлы с одинаковым содержимым, а не размером?
Просто сравните их контрольные суммы (MD5 файла).
Насколько я понимаю принципы поиска дублей, то такие действия (для избежание траты ресурсов) надо делать только для тех файлов, у которых размер совпадает, но есть подозрение что содержание все же не совсем одинаково. Ведь два файла с одинаковым содержанием всегда имеют одинаковый размер, но не всегда при одинаковом размере содержания равны.
 
  • Спасибо
Реакции: crypton
Всем привет, может кто подскажете как можно узнать размер папки. На пример есть папка в которой скачивается файлы, нужно узнать размер того каталога, в который скачивается файлы. Спасибо за любую подсказку.
 
Всем привет, может кто подскажете как можно узнать размер папки. На пример есть папка в которой скачивается файлы, нужно узнать размер того каталога, в который скачивается файлы. Спасибо за любую подсказку.
Получить все файлы в папки, перебрать их суммируя их размер. Если нужен размер на диске - суммировать с учётом размера кластера
 
Получить все файлы в папки, перебрать их суммируя их размер. Если нужен размер на диске - суммировать с учётом размера кластера
Может есть какой то пример, а то я в C# как помягче сказать нуб
 
на форуме не встречал
пробую вот такой вариант, но почему то ошибку выдаёт:
Код:
Развернуть Свернуть Копировать
var folder = project.Directory + "\\files\\" + "torrents\\1";
float folderSize = 0.0f;
FileInfo[] files = System.IO.Directory.GetFiles(folder, "*.*", System.IO.SearchOption.AllDirectories);
foreach(FileInfo file in files) folderSize += file.Length;
 
пробую вот такой вариант, но почему то ошибку выдаёт:
Код:
Развернуть Свернуть Копировать
var folder = project.Directory + "\\files\\" + "torrents\\1";
float folderSize = 0.0f;
FileInfo[] files = System.IO.Directory.GetFiles(folder, "*.*", System.IO.SearchOption.AllDirectories);
foreach(FileInfo file in files) folderSize += file.Length;
какую?
 
замени FileInfo на string
Заменил:
Код:
Развернуть Свернуть Копировать
var folder = project.Directory + "\\files\\" + "torrents\\1";
float folderSize = 0.0f;
string files = System.IO.Directory.GetFiles(folder, "*.*", System.IO.SearchOption.AllDirectories);
foreach(string file in files) folderSize += file.Length;
Теперь такие ошибки выдает:
Тип Время Сообщение
13:01:04 Компиляция кода проекта Ошибка в действии "CS0029" "Cannot implicitly convert type 'string[]' to 'string'". [Строка: 2; Cтолбец: 16]
Тип Время Сообщение
13:01:04 Компиляция кода проекта Ошибка в действии "CS0030" "Cannot convert type 'char' to 'string'". [Строка: 3; Cтолбец: 1]
 
Заменил:
Код:
Развернуть Свернуть Копировать
var folder = project.Directory + "\\files\\" + "torrents\\1";
float folderSize = 0.0f;
string files = System.IO.Directory.GetFiles(folder, "*.*", System.IO.SearchOption.AllDirectories);
foreach(string file in files) folderSize += file.Length;
Теперь такие ошибки выдает:
Тип Время Сообщение
13:01:04 Компиляция кода проекта Ошибка в действии "CS0029" "Cannot implicitly convert type 'string[]' to 'string'". [Строка: 2; Cтолбец: 16]
Тип Время Сообщение
13:01:04 Компиляция кода проекта Ошибка в действии "CS0030" "Cannot convert type 'char' to 'string'". [Строка: 3; Cтолбец: 1]
замени ровно так, как я написал, одно слово на другое
 
Вот так код ошибки не выдает, но и нечего не возвращает:
Код:
Развернуть Свернуть Копировать
var folder = project.Directory + "\\files\\" + "torrents\\1";
float folderSize = 0.0f;
string[] files = System.IO.Directory.GetFiles(folder, "*.*", System.IO.SearchOption.AllDirectories);
foreach(string file in files) folderSize += file.Length;
 
так он и заменил как ты сказал ))
 
сам код нашол здесь https://social.msdn.microsoft.com/F...072108710821080-c?forum=programminglanguageru и пробую его под зеннкой допилить но непашет
Код:
Развернуть Свернуть Копировать
float folderSize = 0.0f;
FileInfo[] files = Directory.GetFiles(folder, "*", SearchOptions.AllDirectories);
foreach(FileInfo file in files) folderSize += file.Length;
 
допиши строку return folderSize;
ОООООО спасибо заработало, вот окончательный код:
Код:
Развернуть Свернуть Копировать
var folder = project.Directory + "\\files\\" + "torrents\\1";
float folderSize = 0.0f;
string[] files = System.IO.Directory.GetFiles(folder, "*.*", System.IO.SearchOption.AllDirectories);
foreach(string file in files) folderSize += file.Length;
return folderSize;
От меня лайк
 
только теперь с переменой будешь брать строки используя регекс так как они все в одной переменой
тогда уже лучше в список закинь сразу
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)