Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.14.141.228] |
|
Сообщ.
#1
,
|
|
|
Допустим, контроллер начудил и в куче файлов вместо данных записались двоичные нули.
Можно ли написать какой-то BAT-ничек, кой пробежался бы по каталогу (и всем подкаталогам, само собой), и все файлы, состоящие только из дв.нулей, поудалял бы? П.С. или же в этих "пакетных средствах" не реализован анализ двоичной внутренности файла? |
Сообщ.
#2
,
|
|
|
Цитата Славян @ В них вообще не предусмотрен какой-либо анализ внутренностей. По текстовым файлам можно пробежаться целиком (построчно), да и то, если они в кодировке ОЕМ, и в них некоторые символы не встречаются. в этих "пакетных средствах" не реализован анализ двоичной внутренности файла? |
Сообщ.
#3
,
|
|
|
Ясно. Ладно, напишем ручками на Си.
|
Сообщ.
#4
,
|
|
|
На Плюсах за 5 минут пишется, Славян.
Добавлено И ещё 5 обход дерева каталогов. |
Сообщ.
#5
,
|
|
|
да это я понимаю. На гемор с обходом много потрачу. Ладно, не беспокойтесь!
|
Сообщ.
#6
,
|
|
|
Типа того:
#include <windows.h> #include <iterator> #include <algorithm> #include <fstream> #include <vector> #include <string> void process(std::string path, std::vector<std::string>& toDel) { static const std::string curDir(1, '.'); static const std::string predDir(".."); WIN32_FIND_DATA findData; HANDLE fHandle; std::string dir = path+='\\'; path += "*.*"; if ((fHandle = FindFirstFile(path.c_str(), &findData)) != INVALID_HANDLE_VALUE) { do { if ((findData.dwFileAttributes & (FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_OFFLINE)) != 0) continue; if ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { if (findData.cFileName == curDir || findData.cFileName == predDir) continue; process(dir + findData.cFileName, toDel); continue; } if ((findData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) { /* Тут обработка линков. Тебе виднее, что с ними делать. */ } std::ifstream inFile((dir + findData.cFileName).c_str(), std::ios::binary); if (std::find_if(std::istream_iterator<unsigned char>(inFile), std::istream_iterator<unsigned char>(), [](unsigned char ch) { return ch != 0; }) == std::istream_iterator<unsigned char>()) toDel.push_back(dir + findData.cFileName); } while (FindNextFile(fHandle, &findData) != 0); FindClose(fHandle); } } int main(int argn, char *argc[]) { std::vector<std::string> zeroedFiles; std::for_each(argc+1, argc + argn, [&](const char* arg) { process(arg, zeroedFiles); }); for (auto i: zeroedFiles) /* DeleteFile(i) */; } |
Сообщ.
#7
,
|
|
|
Цитата Славян @ состоящие только из дв.нулей Может быть у них какой-то хеш брать или другой функцией сворачивать? На PS можно попробовать, он более пригоден для этого чем голый Цитата Славян @ BAT-ничек |
Сообщ.
#8
,
|
|
|
Блин, а если тот контроллер один каталог запорол, то чем проверить конкретно его и поправить ошибки, а не весь диск (сотни гиг) chkdsk'ой проверять?
|
Сообщ.
#9
,
|
|
|
В 16-ричном виде вывести как-то можно попробовать и анализировать содержимое вывода, но это всё будет весьма тормознуто...
Добавлено Как и всё, что делается через BAT-ники |