Skip to content

Instantly share code, notes, and snippets.

@Lazzlo2096
Last active March 5, 2019 19:26
Show Gist options
  • Save Lazzlo2096/ecf44b5953c0dc6a7625ef03635dbbab to your computer and use it in GitHub Desktop.
Save Lazzlo2096/ecf44b5953c0dc6a7625ef03635dbbab to your computer and use it in GitHub Desktop.
Tasks of making 'fdupes-xenon' utility
https://github.com/Lazzlo2096/fdupes-xenon
Необходимость: [maybe]\[want]\[need]\[necessary]
Сложность: [easy]\[mid]\[hard]
* - первоочередные задачи (без которых не былобы этой проги)
WIP x 1
DONE x 2
----------------------------------------------
1) __old age__
1.3)[hard][necessary] должен работать с ярлыками и другими видами link'ов корректно (не удалять оригиналы, считая что хард-ярлык это его копия)
1.4*)[hard] добавить фн-цию мердж ( слить [и выделить разность (хз) ] )
1.4.1) Но сначало определить, могут ли папки быть смержены
1.4.1.1)[WIP] определить полностью ли папки содержат файлы дубликаты
1.4.2) мерджинг лог (что было во что слилось) \ выбрать имя папки от куда брать имена \ или вообще индивидуально
2) __new age__
2.1)[maybe] buty CLI psevdo-GUI.
2.1.2) красивый консольный вывод (хеш-сумму, правильные палочки в путях (not "\ " and "\\" in Windows) и их отсутвие, size, max common folder? )
2.1.2.1)[easy] флаг выводить ли это всё --^ . Или Возможность выбирать тип вывода (кастомный вывод), типа printf("%size %hash %hash %date") хз.
2.2) __Флаги\Аргументы__
2.2.2)[want] выбирать тип хеш-суммы (или даже двойной для избежания коллизий)
2.2.3)[DONE 0.1.2] рекурсивно обходить ли папки или нет
2.2.4)[DONE 0.1.2](by hack) сравнивать две (и более) папки на дубликаты в аргуменах
2.2.5) показывать ли только уникальные файлы
2.3)[want] Выделить функции и тесты в отдельные фалы (?)
3) нарисовать и описать схему работы (безопасное копирование, перемещение и удаление)
4) (продвинутое) определить какой файл мение поверждён (и повреждён ли вообще)
5) распаралелить поиск по каждой папке на процесс (в зависимости от ядерности компа) (?)
6)[want] GUI (?)
7) сделать супер быстрой {а разьве сейчас медленная?} (через sum by ассеблер? Cмотри как он собираеться в асм \ профилировать)
8*) Сделать поиск повторок по строго определённому файлу(или содержимому папки), или группы файлов(папок). [Используй Hash trait Люк!]
----------------------------------
x) нужно ли делать флаги для кадых папок-аргументов отдельно? (мол гибкая настройка)
example:{ fdupiex-xenon -r ./di1 ./dir2_not_rec -r ./dir3; }
or: { fdupiex-xenon ./dir0_not_rec -r ./dir1_rec ./der1_rec -R ./dir2 -r ./dir3_rec; }
Если нет, то тогда можно сделать рекурсивынй обход по умолчанию..
2) Сделать секцию в реадми "Main features" - мол что эту программу отличает от других подобных
4) А карго может make install ?
========= Bugs =============================
#1. [in v0.1.2] Multiple checks.
When ./target/debug/fdupes-xenon ./for\ tests/folder\ 1/ ./for\ tests/folder\ 2/ ./for\ tests/ -r;
#2. [in v]
============================================
возможность удалять дубликаты так:
{
/1/A.txt
/2/A.txt
/1/2/A.txt
/1/B.txt
/2/B.txt
/1/2/B.txt
будет возможность это выбрать: оставить один экземпляр дубликатов которые: самые страые/новые \ лежат в папке X \ имеет имя <regex>
}
=======
а стоит ли делать если уже есть? сделаю лучше и удобней для себя
https://ru.wikipedia.org/wiki/Fdupes
https://github.com/jbruchon/jdupes
и просто для практики в раст
// [FIXIT]
//use std::io::prelude::*; // ?
// https://doc.rust-lang.org/std/fs/struct.File.html
// use std::fs::{*, self};
//enrtries
// let rewq: [u8; 2] = [1, 4];
// let rewq2: [u8; 2] = [1, 4];
// let rewq3: [u8; 2] = [1, 5];
// let werrt = rewq==rewq3;
// println!("{:?}", werrt);
// assert_eq!(true, rewq==rewq2);
// assert_eq!(false, rewq==rewq3);
//------------
let mut hash_paths_dict: HashMap<[u8; 16], Vec<path::PathBuf>> = HashMap::new();
//====================
// let a:[u8; 16] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
// let b:[u8; 16] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1];
// let c:[u8; 16] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2];
// hash_paths_dict.insert(a, vec![]);
// if hash_paths_dict.contains_key(&a) { println!("\tThis is A!"); }
// if hash_paths_dict.contains_key(&b) { println!("\tThis is B!"); }
// let d : Vec<i8> = Vec::new(); // vec![] // [].to_vec()
//======================= unused code
//Похоже я не обрабатываю ошибки
fn _my_read_file( file_name: &str, buf_str: &mut String) -> usize {
//Вообщем я реализвал наконец-то эту функцию, но наверно зазря.. потому что оказалось что и без меня есть read_to_string()
let mut f = fs::File::open(file_name).unwrap();
//Почему он ищет этот файл в корневой папке? Мб карго перенаправляет...
//вместо ?, unwrap() - как исправить? и вообще wtf?
//Почему f должен быть mut?
let mut buffer: String = String::new();
//^ А тут нужен mut? нужен, а зачем?
let len = f.read_to_string(&mut buffer).unwrap();
//^ принимает &mut String
*buf_str = buffer;
// println!("read_to_string: {:?} {}", len, buf_str);
// assert_eq!(len, 5);
// assert_eq!(buf_str, "hello");
return len;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment