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

crypton

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

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

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 451
Благодарностей
1 885
Баллы
113
Помогите пожалуйста сделать снипет который будет удалять в директории дубли файлов с одинаковым размером. С кубиками сложная и долгая конструкция получается (

Снипет определения размера файла есть
Код:
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

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
List<string> temp = List<string>;
а что в этом списке и с чем там идёт сравнение ?
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
сам удивился такому листу, обычно создается новый или приравнивается к какому-то листу
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 451
Благодарностей
1 885
Баллы
113

crypton

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

Код:
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
}}
Снипет отрабатывает без ошибок, но с файлами ничего не происходит (
Может слеши в путях нужны обратные или скобки в названиях файлов надо убирать?
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 451
Благодарностей
1 885
Баллы
113
В списке должны быть полные пути к файлам.
слеши обычные - C:\файл.txt
Не знаю в чем у Вас дело, возможно файлы не идеально одинаковые? Если они отличаются хоть на байт, этим кодом их не удалишь.
Возможно, что пытаетесь работать с системными папками. Если так, то перенесите папку проекта на диск Д, проверьте там.
Проверил у себя - создал десяток копий одного файла, в результате остался один.
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 451
Благодарностей
1 885
Баллы
113
Вы кстати код неправильно скопировали. Там одной скобки не хватает и как результат в цикл не заходит.
 

crypton

Client
Регистрация
04.09.2010
Сообщения
8
Благодарностей
0
Баллы
1
Точно! Видимо скобку упустил, все работает, огромное вам спасибо!
 

Hozy

Client
Регистрация
06.03.2016
Сообщения
146
Благодарностей
12
Баллы
18
@ZennoScript Приветствую! Подскажи пожалуйста, как удалить дубли файлов в папке?
Пример: logo, logo(1), logo(2) и тд. Надо что бы осталось только logo.
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 451
Благодарностей
1 885
Баллы
113
@ZennoScript Приветствую! Подскажи пожалуйста, как удалить дубли файлов в папке?
Пример: logo, logo(1), logo(2) и тд. Надо что бы осталось только logo.
Ищите файлы по маске.
Берёте имя файла logo, получаете список файлов по маске logo* , после чего удаляете. Как то так наверное?
Можно получить полностью весь список файлов в папке, после чего удалить строки, не соответствующие регулярному выражению - \(\d+\) Таким образом удаляться все пути к файлам типа logo. Всё. Берёте по одной строке и удаляете все файлы.
 

КарлМаркс

Активный пользователь
Регистрация
11.07.2017
Сообщения
200
Благодарностей
64
Баллы
28

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с КарлМаркс какие-либо сделки.

Ищите файлы по маске.
Берёте имя файла logo, получаете список файлов по маске logo* , после чего удаляете. Как то так наверное?
Можно получить полностью весь список файлов в папке, после чего удалить строки, не соответствующие регулярному выражению - \(\d+\) Таким образом удаляться все пути к файлам типа logo. Всё. Берёте по одной строке и удаляете все файлы.
А как удалить файлы с одинаковым содержимым, а не размером?
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
А как удалить файлы с одинаковым содержимым, а не размером?
Просто сравните их контрольные суммы (MD5 файла).
Насколько я понимаю принципы поиска дублей, то такие действия (для избежание траты ресурсов) надо делать только для тех файлов, у которых размер совпадает, но есть подозрение что содержание все же не совсем одинаково. Ведь два файла с одинаковым содержанием всегда имеют одинаковый размер, но не всегда при одинаковом размере содержания равны.
 
  • Спасибо
Реакции: crypton

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8
Всем привет, может кто подскажете как можно узнать размер папки. На пример есть папка в которой скачивается файлы, нужно узнать размер того каталога, в который скачивается файлы. Спасибо за любую подсказку.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Всем привет, может кто подскажете как можно узнать размер папки. На пример есть папка в которой скачивается файлы, нужно узнать размер того каталога, в который скачивается файлы. Спасибо за любую подсказку.
Получить все файлы в папки, перебрать их суммируя их размер. Если нужен размер на диске - суммировать с учётом размера кластера
 

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8
Получить все файлы в папки, перебрать их суммируя их размер. Если нужен размер на диске - суммировать с учётом размера кластера
Может есть какой то пример, а то я в C# как помягче сказать нуб
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8
на форуме не встречал
пробую вот такой вариант, но почему то ошибку выдаёт:
Код:
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;
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
пробую вот такой вариант, но почему то ошибку выдаёт:
Код:
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;
какую?
 

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8
замени 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]
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Заменил:
Код:
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]
замени ровно так, как я написал, одно слово на другое
 

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8
Вот так код ошибки не выдает, но и нечего не возвращает:
Код:
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;
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
так он и заменил как ты сказал ))
 

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
допиши строку return folderSize;
 
  • Спасибо
Реакции: Saulius S.

Saulius S.

Client
Регистрация
19.08.2016
Сообщения
44
Благодарностей
7
Баллы
8
допиши строку 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;
От меня лайк
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
только теперь с переменой будешь брать строки используя регекс так как они все в одной переменой
тогда уже лучше в список закинь сразу
 

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