На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Jin X
  
> Удаление файлов из нулей
    Допустим, контроллер начудил и в куче файлов вместо данных записались двоичные нули.
    Можно ли написать какой-то BAT-ничек, кой пробежался бы по каталогу (и всем подкаталогам, само собой), и все файлы, состоящие только из дв.нулей, поудалял бы?
    П.С. или же в этих "пакетных средствах" не реализован анализ двоичной внутренности файла?
      Цитата Славян @
      в этих "пакетных средствах" не реализован анализ двоичной внутренности файла?
      В них вообще не предусмотрен какой-либо анализ внутренностей. По текстовым файлам можно пробежаться целиком (построчно), да и то, если они в кодировке ОЕМ, и в них некоторые символы не встречаются.
        Ясно. Ладно, напишем ручками на Си. :oops:
          На Плюсах за 5 минут пишется, Славян.

          Добавлено
          И ещё 5 обход дерева каталогов.
            да это я понимаю. На гемор с обходом много потрачу. Ладно, не беспокойтесь!
              Типа того:
              ExpandedWrap disabled
                #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) */;
                }
                Цитата Славян @
                состоящие только из дв.нулей

                Может быть у них какой-то хеш брать или другой функцией сворачивать?
                На PS можно попробовать, он более пригоден для этого чем голый
                Цитата Славян @
                BAT-ничек
                  Блин, а если тот контроллер один каталог запорол, то чем проверить конкретно его и поправить ошибки, а не весь диск (сотни гиг) chkdsk'ой проверять? :wall:
                    В 16-ричном виде вывести как-то можно попробовать и анализировать содержимое вывода, но это всё будет весьма тормознуто...

                    Добавлено
                    Как и всё, что делается через BAT-ники :tong:
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0378 ]   [ 17 queries used ]   [ Generated: 19.03.24, 04:03 GMT ]