Вопрос о программе Total Commander, Софт вопросы
1.03.2018 - 20:39 |
nokeMoH
профи!
Группа: Пользователи Сообщений: 1.076 Регистрация: 23.08.2008 Пользователь №: 1.040.887
Респектов: 124
Предупреждений:
| Цитата | Quote(HugoBo-SS @ 1.03.2018 - 19:05) Любые плагины ( если они правильно упакованы в zip, а, как правило, это так) устанавливаются самим тоталом при двойном( одинарном - если настроено подобное поведение) клике по нему, с предупреждениями ( на случай случайного нажатия). Не проверял такой способ адаптации плагинов в тотал.командер, и наверное не стану, с трудом дался первый рабочий метод добавления плагина в тотал, которому пришлось научиться с нуля ни чего не зная, второй уже не осилю, буду пользоваться первым удачным способом, который у меня получился, я извлекал ZIP и на выходе получил обычную папку с файлами, а далее через настройки тотал.командера указал путь к плагину, так он и добавился, а речь видимо шла о двойном клике по ZIP непосредственно из самого менеджера тотал.командера, чтобы он подхватил это нажатие и сам установил плагин как нужно.. Это мне сейчас стало понятно, так как с первого раза прочитав я не понял, как двойной клик по ZIP установит плагин сразу в тотал.командер, видимо этот дабл клик нужно сделать прямо в менеджере, но уже не это важно, плагины с танцами, но добавлены, ух.. а тут, мне нужно ещё разочек давайте поясню вот что.. Только на этот раз постараюсь максимально наглядно пояснить чего я хочу добиться, с примерами.. К примеру у нас есть 4 файла (текстовый документ), это их скрины.. » .txt « А вот так, эти 4 файла выглядят, если их открыть при помощи любого HEX редактора.. » HEX редактор « Как от сюда можно увидеть, у первых трёх файлов, начало документа совпадает, а именно - они все начинаются со "слов" abc.. У четвёртого файла это "слово" (совпадение) тоже есть, но находиться оно это совпадение не с начала файла, а спустя некое количество символов (байт).. Мне нужно: среди огромной своры файлов, найти все файлы, с расширением и без, у которых НАчало ФАйла (первые три байта), исключительно ПЕРВЫЕ три байта, равны в данном случае abc, то есть найти все файлы, текст которых содержит значение abc, но исключительно только в Первых трёх байтах, и только в них.., следовательно, 4-ый файл как результат поиска сюда не подходит, потому что у него это совпадение не лежит в диапозоне с 1 по 3 байт включительно.. Существуют утилиты, которые могут найти документ по его содержимому, с помощью таких утилит найти файл содержащий "слово" abc не получиться, так как подобные инструменты не ограничиваются объёмом просматриваемого документа, то есть не могут просканировать его половину, одну треть или только к примеру 15 первых байт, а будут искать запрос до той поры, пока не просканируют весь документ полностью, - это не нужно - только первые три байта.. В данном случае, которого я хочу добиться, если бы механизм работал, и Тотал.Командером с нужным плагином было бы можно ограничить поиск "текста" внутри файла, то есть заставить его сравнивать поисковый запрос только с ПЕРВЫМИ тремя байтами во всех файлах, и если в первых ТРЁХ байтах совпадения нету, не искать дальше по содержимому файла, - а переходить к следующему и так же, смотреть только первые три БАЙТА, опять нету совпадения, переходить к следующему файлу и сканировать его, и так далее далее далее... и находить только те файлы, где есть Совпадения исключителньо только с первыми тремя байтами относительно поискового запроса пользователя.. Нюанс: поисковый запрос будет записан не в виде abc, а в виде его HEX кода, то есть в случае, когда нам будет нужно найти все файлы, чьи ПЕРВЫЕ ТРИ БАЙТА равны abc, мы в поисковом запросе напишем 61 62 63 (смотреть второй спойлер) | |
| |
2.03.2018 - 8:44 |
nokeMoH
профи!
Группа: Пользователи Сообщений: 1.076 Регистрация: 23.08.2008 Пользователь №: 1.040.887
Респектов: 124
Предупреждений:
| Цитата | Quote(AquaTour @ 2.03.2018 - 1:46) nokeMoH, про 3 байта я понял с самого начала, задача решается кодом в 20 строк Кодом в 20 строк плагина для Тотал.Командера или отдельного приложения ?, хотя путь к конечной цели не так важен, как результат самой цели, если есть возможность её достич любым из доступных способов.. Не знаю про какие 20 строк Вы говорили AquaTour, но если это не слишком трудно, не смогли бы Вы помочь чем сможете ?.. забегая немного вперёд, не уверен в каком из будущих это будет полезным, но пригодиться когда-нибудь сможет.. Если у Вас получиться, можно пожалуйста оставить возможность поиска не только по первым трём байтам, но и по любому их количеству ?.. То есть если вдруг, кому-то когда-то понадобиться так же как и мне, воплотить эту чудную задачу в жизнь, только в том случае, будет нужна возможность поиска файлов по первым 10 или 25 байтам к примеру, чтобы осталась возможность у этих 20 строк Надстройка, где можно было бы для себя настроить схему поиска, не по первым трём байтам например, а по первым 34 к примеру или любое другое количество.. и если снова будет не трудно, на будущее, оставить надстройку для выбора диапазона поиска, то есть если ищем совпадение к примеру определённых 10 байт в файле со Строкой Поиска, то чтобы этот поиск происходил не с 1 по 10 включительно байт каждого файла, а допустим с 31 по 40 включительно (то есть тоже 10 байт, но со смещением в 30 байт включительно от начала файла).. нижнее не так важно как верхнее, хотя и тоже могло оказаться быть полезным.. | |
| |
2.03.2018 - 12:00 |
AquaTour
Специалист
Группа: Пользователи Сообщений: 417 Регистрация: 4.07.2005 Пользователь №: 27.183
Респектов: 50
Предупреждений: 0
| » Нажмите, для открытия спойлера | Press to open the spoiler « Code using System; using System.IO;
namespace ConsoleApp1 { static class Program { private static byte[] _pattern; private static int _offset;
static void Main(string[] args) { if (args.Length < 3) { Console.WriteLine("program.exe offset pattern directory"); return; }
if (!int.TryParse(args[0], out _offset)) { Console.WriteLine("offset must be integer"); return; }
if (args[1].Length % 2 != 0) { Console.WriteLine("incorrect pattern length, must be a multiple of two"); return; }
_pattern = new byte[args[1].Length / 2]; for (int i = 0; i < _pattern.Length; i++) { var hexValue = args[1].Substring(i * 2, 2); try { _pattern[i] = Convert.ToByte(hexValue, 16); } catch (Exception e) { Console.WriteLine("{0} - {1}", hexValue, e.Message); return; } }
if (!Directory.Exists(args[2])) { Console.WriteLine("Target directoty not found"); return; }
DirSearch(args[2]); }
private static void DirSearch(string dir) { string[] fileList = { }; try { fileList = Directory.GetFiles(dir); } catch (Exception e) { Console.WriteLine("{0} - {1}", dir, e.Message); } foreach (string path in fileList) { try { var flag = true; using (var reader = new BinaryReader(File.OpenRead(path))) { var buffer = reader.ReadBytes(_pattern.Length + _offset); if (buffer.Length - _offset != _pattern.Length) { continue; }
for (int i = 0; i < _pattern.Length; i++) { if (_pattern[i] != buffer[i + _offset]) { flag = false; break; } } }
if (flag) { Console.WriteLine(path); } } catch (Exception e) { Console.WriteLine("{0} - {1}", path, e.Message); } } string[] dirList = { }; try { dirList = Directory.GetDirectories(dir); } catch (Exception e) { Console.WriteLine("{0} - {1}", dir, e.Message); } foreach (string d in dirList) { DirSearch(d); } } } } »» Нажмите, для закрытия спойлера | Press to close the spoiler «« сохранить в файл с расширением cs, например program.cs скомпилировать c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe Program.cs Запускать лучше с перенаправлением вывода в файл program.exe c:\target_dir > filelist.txt искомая последовательность задается в массиве pattern, можно менять и коды и количество элементов сигнатуры смещение задается через offset Сообщение отредактировал AquaTour - 3.03.2018 - 1:20 | |
| |
2.03.2018 - 17:06 |
zoog
профи!
Группа: Пользователи Сообщений: 913 Регистрация: 13.09.2007 Пользователь №: 497.976
Респектов: 52
Предупреждений: 0
| Цитата | Quote если искать по последовательности байт, то установка ^ перед искомой последовательностью может дать ложные совпадения Да, я писал, что это потом надо будет вручную разгрести. Сейчас задал поиск 4байт среди 6ГБ файлов, - найдено в 3х. | |
| |
2.03.2018 - 20:57 |
nokeMoH
профи!
Группа: Пользователи Сообщений: 1.076 Регистрация: 23.08.2008 Пользователь №: 1.040.887
Респектов: 124
Предупреждений:
| Цитата | Quote(AquaTour @ 2.03.2018 - 12:23) ... Большое спасибо, нашёл статью как скомпилировать файл, на выходе получил *.exe и Вашей предложенной командой пытался получить необходимый список program.exe c:\target_dir > filelist.txt, что-то не так » Spoiler « c:\pagefile.sys - Процесс не может получить доступ к файлу "c:\pagefile.sys", так как этот файл используется другим процессом. c:\swapfile.sys - Процесс не может получить доступ к файлу "c:\swapfile.sys", так как этот файл используется другим процессом. Это написано в файле filelist.txt»» Нажмите, для закрытия спойлера | Press to close the spoiler «« можно пожалуйста несколько вопросов ?.. (1). Что это такое ?.. » Вот это « Цитата | Quote class Program { private static byte[] pattern = {0x41, 0x42, 0x43}; private static int offset = 0; static void Main(string[] args) »» Нажмите, для закрытия спойлера | Press to close the spoiler «« если мне нужно найти "слово" abc, HEX редактор его видит как 61 62 63, я должен записать вот так ?.. » вот так « Цитата | Quote class Program { private static byte[] pattern = {0x61, 0x62, 0x63}; private static int offset = 0; static void Main(string[] args) »» Нажмите, для закрытия спойлера | Press to close the spoiler «« (2). Как утилита определяет, в какую директорию она будет записывать файл filelist.txt ?.. (3). Как утилита определяет с какой директории нужно сделать список файлов ?.. | |
| |
2.03.2018 - 21:54 |
nokeMoH
профи!
Группа: Пользователи Сообщений: 1.076 Регистрация: 23.08.2008 Пользователь №: 1.040.887
Респектов: 124
Предупреждений:
| А где и как нужно указать абсолютный путь для обработки файлов программой ?.. допустим утилита program.exe находиться по адресу C:\Soft, а нужно получить список файлов из каталога C:\Files, как быть тогда, это возможно такое ?, если возможно, то где в таком случае будет сохраняться файл filelist.txt ?.. p.s.: а зачем нужно это ?.. » Spoiler « Цитата | Quote class Program { private static byte[] pattern = {0x41, 0x42, 0x43}; private static int offset = 0; static void Main(string[] args) »» Нажмите, для закрытия спойлера | Press to close the spoiler «« Ноль икс так необходим что без него нельзя записать этот код ?, он может запутать лишний раз мешая визуализировать полезную информацию.. | |
| |
|
|