Progress Bar (WinAPI)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by KaE, 30 Aug 2010.

  1. KaE

    KaE New Member

    Joined:
    27 Sep 2009
    Messages:
    44
    Likes Received:
    1
    Reputations:
    5
    Пишу одну тулзовину на C используя WinAPI. В ней есть одна функциональность - поиск файлов на диске по определенным критериям. Необходимо отобразить при помощи Progress Bar-a сам процесс проверки файлов по определенному. Вопрос в том как расчитать шаг для этого контрола. Пример - Progress Bar в диалоге, например, когда мы выполняем копирование или удаление. Была задумка подсчитать общее количество файлов на диске, но это не оптимально. Немного подумав, пришел в выводу, что надо делать привязку по размерам проверяемых файлов и размеру диска. Так вот как сделать такую привязку или отображение на Progress Bar-e? То есть сколько файлов проверено, и сколько осталось проверить.

    PS Всю башку себе изломал.
     
  2. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    хм...
    мне кажется чтобы делать прогресс бар по размеру файла
    нужно будет определить размер всех сканируемых файлов для начала
    а это нагружает систему лишний раз
    поправте меня если я не прав
     
  3. KaE

    KaE New Member

    Joined:
    27 Sep 2009
    Messages:
    44
    Likes Received:
    1
    Reputations:
    5
    Ну в принципе размер всех сканируемых определяется исходя из общего размера диска минус размер свободного пространства. И то и то получается. То есть общий объем, занимаемый всеми файлами на диске в системе мне известен.
     
  4. KaE

    KaE New Member

    Joined:
    27 Sep 2009
    Messages:
    44
    Likes Received:
    1
    Reputations:
    5
    Имеется ввиду не физическом диске, а разделе, например D:
     
  5. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    да интересный момент
    нужно както следить за колл. перелопаченного колл. мегабайтов
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    ну да, можно по размеру. файлов. А чтобы узнать размер файла, то не надо особо напрягаться. да и система не напрягается тоже при отдаче размера. потомучто берет из файловой системы.
    Темболее когда ишешь через FindFirstFile то можно заюзать так:
    Ищи все файлы, а там проверяй вручкую что тебе нужно а из структуры WIN32_FIND_DATA бери размер файла
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;

    Главное не напороться на один подводный камень.
    Размер файла - это одно, а занимаемое место файлом - это другое.
    т.е. надо учитывать остаток кластера.
    По этому размер так идет:
    Занятое место на диске = занятое место файлом 1 + занятое место файлом 2 +....

    занятое место файлом = размер файла + остаток кластера
    занятое место файлом можно вычислить как:
    1) если размер файл кратен размеру кластера, то занятое место равно размеру файла.
    2) если размер файла не кратен размеру кластера, то занятое место равно
    ((целая часть от деления размера файла на размер кластера)+1) * на размер кластера.
    Можно и проще считать но это уже другая история.
     
    #6 slesh, 30 Aug 2010
    Last edited: 30 Aug 2010
  7. KaE

    KaE New Member

    Joined:
    27 Sep 2009
    Messages:
    44
    Likes Received:
    1
    Reputations:
    5
    Всем спасибо за советы и ответы...

    А через ядро это можно как-то замутить? То есть напрямую обратиться из UserSpace в ядро посредством какого-либо вызова, и получить инфо о файловой системе, то есть кол-во файлов, размер и т.п?
     
  8. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 KaE увы никак. потому что кол-во файлов тебе не скажет файловая система, потому что каталоги имеют иерархическую структуру. т.е. каждый каталог знает только а файлах и папках которые расположены в нем, что находится в других каталогах он знать не может.
    Именно по этому вычисления кол-ва файлов - это задача быстрого обхода каталогов и проверки кол-ва файлов в них.
     
  9. KaE

    KaE New Member

    Joined:
    27 Sep 2009
    Messages:
    44
    Likes Received:
    1
    Reputations:
    5
    В любом случае спасибо)