На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Рекурсивный поиск файлов заполняет не выгруженный пул памяти Си WINAPI , Рекурсивный поиск файлов заполняет не выгруженный пул памяти Си WINAPI
    Цитата Qraizer @
    Так что если где и утечка, то явно не в SearchFiles()

    Согласен.fFile была объявлена глобально.Думаю,проблема была в этой переменной.
    Перенёс её в функцию и передаю как аргумент,там же выделяю память.
    Перепишу и протестирую.
    Спасибо,что проверили.

    Добавлено
    Цитата ЫукпШ @

    Благодарю.Интересный подход.Обязательно попробую.
      Цитата Sherman @
      Интересный подход

      Интересный подход для FAT, и в тоже время - неинтересный для NTFS.
      Все почему-то помнят только про файлы и каталоги, но напрочь забывают по хард-линки.
      А ведь так можно и улететь в бесконечный скан.
        Только не хард-линки, а соединения, да и то только для каталогов. Хотя для файлов тоже имеет смысл сканить, чтоб не обрабатывать дубликаты, но к ошибкам это-таки не приведёт.

        P.S. Если уж заводить разговор за стратегически правильный код, то там много что учитывать надо. Нужно отсекать как минимум FILE_ATTRIBUTE_TEMPORARY и FILE_ATTRIBUTE_OFFLINE. Нужно пытаться зайти в очередной каталог и проверять успех, а то вдруг прав нет туда заглядывать, иначе тоже легко можно свалиться в бесконечный скан одного и того же каталога. И если речь о каком-то аналоге бэкапа, было бы неплохо хотя бы пробовать не обновлять время доступа к очередному файлу, чтоб не ломать статистику по частоте использования.
          Цитата JoeUser @
          Все почему-то помнят только про файлы и каталоги, но напрочь забывают по хард-линки.

          Что-то вообще сложное... .Попробую изучить эту тему.Спасибо.

          Добавлено
          Есть вопрос по кол-ву потоков.
          Пишу программку,которая будет искать все файлы на ПК,проверяя расширение файла.
          Если расширение файла совпадает с тем,что я укажу,mp4 например,создаёт поток передавая функции потока строку,содержащую полный путь к файлу.
          Функция потока,в свою очередь,копирует найденные файлы на внешний жёсткий,который я тоже укажу.
          Для этого я использую функции WINAPI(CreateFile,CreateFileMapping,MapViewOfFile).
          Какое кол=во потоков можно использовать,для этой задачи?
          Пока я просто ищу файлы,передаю строки в потоки и там вывожу их в консоль.
          Так же вывожу целое число,которое соответствует кол-ву переданных строк в функцию потока.
          Но я заметил,что число файлов показывает разное,при одинаковых условиях.
          Чем больше потоков,тем больше разница.
          Пробовал от 2 до 5000 потоков.(в качестве эксперимента)
          На 500 потоков разнице +-10,на 5000 около 100000 строк.
            Цитата Qraizer @
            P.S. Если уж заводить разговор за стратегически правильный код, то там много что учитывать надо. Нужно отсекать как минимум FILE_ATTRIBUTE_TEMPORARY и FILE_ATTRIBUTE_OFFLINE.

            я делал так:
            Для файлов : FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_OFFLINE
            Для директорий : FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_OFFLINE | FILE_ATTRIBUTE_REPARSE_POINT
            И конечно, проверка на ошибку "ERROR_ACCESS_DENIED".
            Детали я точно не помню. Но ничего страшного с запретом доступа нет.
            Перечислить такую директорию (убедиться в её наличии) можно,
            а искать файлы внутри нельзя. Произойдёт ошибка и цикл завершиться, ничего
            страшного. Следить за этой ошибкой полезно исключительно в информационном смысле,
            для выдачи сообщения, что "зайти туда было запрещено".
            Сообщение отредактировано: ЫукпШ -
              Цитата ЫукпШ @
              И конечно, проверка на ошибку "ERROR_ACCESS_DENIED".

              Не подскажете,как сделать эту проверку?
                Цитата Sherman @
                Какое кол=во потоков можно использовать,для этой задачи?


                Цитата Sherman @
                Функция потока,в свою очередь,копирует найденные файлы на внешний жёсткий,который я тоже укажу.
                Для этого я использую функции WINAPI(CreateFile,CreateFileMapping,MapViewOfFile).
                Какое кол=во потоков можно использовать,для этой задачи?

                Я ж тебе вроде писал, что достаточно трёх потоков. С тех пор ничего не изменилось.
                Не работает функция в потоке _beginthreadex (сообщение #3798301)
                  Цитата Qraizer @
                  Только не хард-линки, а соединения, да и то только для каталогов.

                  Ну я образно. Хотя ты прав недо-хардлинки :)

                  Цитата Sherman @
                  Что-то вообще сложное... .Попробую изучить эту тему.Спасибо.

                  Так это еще не все, не расслабляйся! :lol: Надо искать файлы, которых "в явном виде нет, а они есть". Я про NTFS-потоки, а-ля:
                  ExpandedWrap disabled
                    echo file-1>file-1.txt
                    echo secret-1>file-1.txt:secret-1.txt

                  Файл secret-1.txt в листинге dir не виден. Но он есть, и он - в потоке файла file-1.txt, и можно убедиться:
                  ExpandedWrap disabled
                    notepad file-1.txt
                    notepad file-1.txt:secret-1.txt
                    Цитата Олег М @
                    Я ж тебе вроде писал, что достаточно трёх потоков. С тех пор ничего не изменилось.

                    Да,я помню,но с тем способом вообще беда у меня.
                    Я даже нигде не встречах подобие того,что вы описали.

                    Добавлено
                    Цитата JoeUser @

                    :blink:
                    Сообщение отредактировано: Sherman -
                      Цитата Sherman @
                      Цитата ЫукпШ @
                      И конечно, проверка на ошибку "ERROR_ACCESS_DENIED".

                      Не подскажете,как сделать эту проверку?

                      ExpandedWrap disabled
                         BOOL RetC=FALSE;
                         // ...
                                   hFind = ::FindFirstFile(pTempName, &FindFileData);
                                   if(hFind == INVALID_HANDLE_VALUE) {RetC = FALSE;}
                                   else                              {RetC = TRUE; }
                         //...
                                   RetC = ::FindNextFile(...);
                         
                         if(RetC == FALSE)
                         {
                           DWORD LE = ::GetLastError();
                         
                        // возможные результаты окончания
                           if(LE == ERROR_NO_MORE_FILES)  {...}  // ERROR_NO_MORE_FILES = 18, больше файлов не осталось
                           if(LE == ERROR_FILE_NOT_FOUND) {...}  // ERROR_FILE_NOT_FOUND = 2, файл не найден
                           if(LE == ERROR_PATH_NOT_FOUND) {...}  // ERROR_PATH_NOT_FOUND = 3, path не найден
                         
                        // доступ запрещён
                           if(LE == ERROR_ACCESS_DENIED) {...}
                         
                        // другое - совсем плохо
                         }
                      Сообщение отредактировано: ЫукпШ -
                        Цитата ЫукпШ @

                        Большое, спасибо!
                          Цитата Sherman @
                          Да,я помню,но с тем способом вообще беда у меня.
                          Я даже нигде не встречах подобие того,что вы описали.

                          А что встречал - как на каждый чих зафигачить поток, авось система сама разберётся?

                          Вообще - не надо решать все проблемы одновременно. Все эти хардлинки с атрибутами это вторичная проблема, не факт, что с ней столкнёшься.
                          Основной алгоритм здесь - асинхронный поиск и копирование, у тебя он не решён. Лучше сосредоточиться на нём, а когда заработает как часы, тогда уже можно заняться и деталями.
                            Цитата Олег М @
                            Все эти хардлинки с атрибутами это вторичная проблема, не факт, что с ней столкнёшься.

                            Не правда твоя! :)

                            Берем системный диск любой современной версии винды и видим сразу же в корне соединение "Users" -> "Documents and Settings":

                            user posted image
                              Цитата JoeUser @
                              Не правда твоя!

                              Необязательно тестировать на Document and Settings.
                                Точнее - лучше не сканить систем диск с корня, иначе сбудутся пророчества тяжёлых времён :-)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0505 ]   [ 17 queries used ]   [ Generated: 28.03.24, 17:40 GMT ]