Что нового

топ 10 файлов

gagarin74

Новичок
Сообщения
47
Репутация
0
Добрый день.
Встала задача почистить на предприятие все файло помойки. Их около 12. Архитектура папок - логике не поддается(могут быть пустыми могут быть с 10 вложениями итд итп).
Но почистить это пол дела. Мне бы еще понять логику появления файлов- что бы в дальнейшем этого не допускать.
В связи с этим прошу,может кто напишет код. Который просто анализировал указанный каталог - и писал в формате топ 10(топ 20)
- количество одинаковых файлов по названию. Что бы понимать чем засорено (и откуда берутся) эти файлы. Файло хронилище,в данном случаи -это не только файлы пользователей - с ними то как раз проблем нет. В файло хронилище -стекаются бэкапы,логи итд итп.
Достаточно следующей информации

1 ikon (название файла) ,825456 (количество файлов с таким именем в указанной директории),средний размер файла
2 pain (название файла) ,124568 (количество файлов с таким именем в указанной директории),средний размер файла
3 razrab (название файла) ,24568 (количество файлов с таким именем в указанной директории),средний размер файла
4 итд итп
5..
6..
7..
8..
9..
10..

p.s. если в заданной директории есть файлы ikon, ikon01, ikon1 - то считается что их 3.
p,s, степень анализа в глубь в папках - до последней.

СПАСИБО!!!! Всем УДАЧНОГО дня!!! Здоровья!!!
 

All2khoff

Продвинутый
Сообщения
382
Репутация
70
Попробуйте такой вариант,
нет ограничений на вывод в виде топ 10
Сейчас просто всё что найдет по указаному пути выдаст, с сотрировкой от максимального количества файлов.
Для "переключения" режима вывода оставлены комментарии на 93 и 94 строках.
Код:
#include <File.au3>
#include <Array.au3>

Global $fileStats[1][3] = [["", 0, 0]] ; Массив: [имя файла, количество, общий размер]

; Функция для сбора статистики по файлам
Func GatherFileStatistics($directory)
    Local $search, $file, $fileSize

    ; Рекурсивный поиск файлов
    $search = FileFindFirstFile($directory & "\*")
    If $search = -1 Then Return

    While 1
        $file = FileFindNextFile($search)
        If @error Then ExitLoop

        ; Игнорируем каталоги
        If StringInStr($file, ".") Then
            ; Получаем путь к файлу
            Local $filePath = $directory & "\" & $file
            $fileSize = FileGetSize($filePath)

            ; Обновляем статистику
            Local $found = False
            For $i = 0 To UBound($fileStats) - 1
                If $fileStats[$i][0] = $file Then
                    $fileStats[$i][1] += 1 ; увеличиваем счетчик
                    $fileStats[$i][2] += $fileSize ; общий размер
                    $found = True
                    ExitLoop
                EndIf
            Next

            ; Если файл не найден, добавляем его в массив
            If Not $found Then
                ReDim $fileStats[UBound($fileStats) + 1][3]
                $fileStats[UBound($fileStats) - 1][0] = $file
                $fileStats[UBound($fileStats) - 1][1] = 1 ; начальный счетчик
                $fileStats[UBound($fileStats) - 1][2] = $fileSize ; общий размер
            EndIf
        EndIf

        ; Проверяем подкаталоги
        If StringInStr(FileGetAttrib($directory & "\" & $file), "D") Then
            GatherFileStatistics($directory & "\" & $file)
        EndIf
    WEnd

    FileClose($search)
EndFunc

; Основной код
Local $pathToScan = "\\PC-02\Distrib" ; Замените на свой путь
GatherFileStatistics($pathToScan)

; Создание вспомогательного массива для сортировки
Local $sortArray[UBound($fileStats)][2]
For $i = 0 To UBound($fileStats) - 1
    $sortArray[$i][0] = $fileStats[$i][1] ; Количество
    $sortArray[$i][1] = $i ; Индекс в исходном массиве
Next

; Сортировка массива по количеству от большего к меньшему (пузырьковая сортировка)
For $i = 0 To UBound($sortArray) - 2
    For $j = 0 To UBound($sortArray) - 2 - $i
        If $sortArray[$j][0] < $sortArray[$j + 1][0] Then
            ; Меняем местами значения
            Local $tempCount = $sortArray[$j][0]
            Local $tempIndex = $sortArray[$j][1]

            $sortArray[$j][0] = $sortArray[$j + 1][0]
            $sortArray[$j][1] = $sortArray[$j + 1][1]

            $sortArray[$j + 1][0] = $tempCount
            $sortArray[$j + 1][1] = $tempIndex
        EndIf
    Next
Next

; Вывод результатов
Local $header = StringFormat("%-60s %-35s %s", "Название файла", "Количество", "Средний размер (в байтах)")
ConsoleWrite($header & @CRLF)

; Создание разделителя
Local $separator = ""
For $j = 1 To StringLen($header)
    $separator &= "-"
Next
ConsoleWrite($separator & @CRLF)

; Выводим отсортированные результаты
;~ For $i = 0 To UBound($sortArray) - 1            ;раскомментировать если нужен вывод всех файлов
    For $i = 0 To 10                            ;закоментировать если нужен вывод всех файлов
    Local $originalIndex = $sortArray[$i][1]
    Local $fileName = $fileStats[$originalIndex][0]
    Local $count = $fileStats[$originalIndex][1]
    Local $totalSize = $fileStats[$originalIndex][2]
    Local $averageSize = $count > 0 ? Round($totalSize / $count, 2) : 0

    ; Форматируем строки для вывода
    ConsoleWrite(StringFormat("%-60s %-35d %-10s", $fileName, $count, $averageSize) & @CRLF)
Next
 
Последнее редактирование:
Автор
G

gagarin74

Новичок
Сообщения
47
Репутация
0
Попробуйте такой вариант,
нет ограничений на вывод в виде топ 10
Сейчас просто всё что найдет по указаному пути выдаст, с сотрировкой от максимального количества файлов.
Для "переключения" режима вывода оставлены комментарии на 93 и 94 строках.
Код:
#include <File.au3>
#include <Array.au3>

Global $fileStats[1][3] = [["", 0, 0]] ; Массив: [имя файла, количество, общий размер]

; Функция для сбора статистики по файлам
Func GatherFileStatistics($directory)
    Local $search, $file, $fileSize

    ; Рекурсивный поиск файлов
    $search = FileFindFirstFile($directory & "\*")
    If $search = -1 Then Return

    While 1
        $file = FileFindNextFile($search)
        If @error Then ExitLoop

        ; Игнорируем каталоги
        If StringInStr($file, ".") Then
            ; Получаем путь к файлу
            Local $filePath = $directory & "\" & $file
            $fileSize = FileGetSize($filePath)

            ; Обновляем статистику
            Local $found = False
            For $i = 0 To UBound($fileStats) - 1
                If $fileStats[$i][0] = $file Then
                    $fileStats[$i][1] += 1 ; увеличиваем счетчик
                    $fileStats[$i][2] += $fileSize ; общий размер
                    $found = True
                    ExitLoop
                EndIf
            Next

            ; Если файл не найден, добавляем его в массив
            If Not $found Then
                ReDim $fileStats[UBound($fileStats) + 1][3]
                $fileStats[UBound($fileStats) - 1][0] = $file
                $fileStats[UBound($fileStats) - 1][1] = 1 ; начальный счетчик
                $fileStats[UBound($fileStats) - 1][2] = $fileSize ; общий размер
            EndIf
        EndIf

        ; Проверяем подкаталоги
        If StringInStr(FileGetAttrib($directory & "\" & $file), "D") Then
            GatherFileStatistics($directory & "\" & $file)
        EndIf
    WEnd

    FileClose($search)
EndFunc

; Основной код
Local $pathToScan = "\\PC-02\Distrib" ; Замените на свой путь
GatherFileStatistics($pathToScan)

; Создание вспомогательного массива для сортировки
Local $sortArray[UBound($fileStats)][2]
For $i = 0 To UBound($fileStats) - 1
    $sortArray[$i][0] = $fileStats[$i][1] ; Количество
    $sortArray[$i][1] = $i ; Индекс в исходном массиве
Next

; Сортировка массива по количеству от большего к меньшему (пузырьковая сортировка)
For $i = 0 To UBound($sortArray) - 2
    For $j = 0 To UBound($sortArray) - 2 - $i
        If $sortArray[$j][0] < $sortArray[$j + 1][0] Then
            ; Меняем местами значения
            Local $tempCount = $sortArray[$j][0]
            Local $tempIndex = $sortArray[$j][1]

            $sortArray[$j][0] = $sortArray[$j + 1][0]
            $sortArray[$j][1] = $sortArray[$j + 1][1]

            $sortArray[$j + 1][0] = $tempCount
            $sortArray[$j + 1][1] = $tempIndex
        EndIf
    Next
Next

; Вывод результатов
Local $header = StringFormat("%-60s %-35s %s", "Название файла", "Количество", "Средний размер (в байтах)")
ConsoleWrite($header & @CRLF)

; Создание разделителя
Local $separator = ""
For $j = 1 To StringLen($header)
    $separator &= "-"
Next
ConsoleWrite($separator & @CRLF)

; Выводим отсортированные результаты
;~ For $i = 0 To UBound($sortArray) - 1            ;раскомментировать если нужен вывод всех файлов
    For $i = 0 To 10                            ;закоментировать если нужен вывод всех файлов
    Local $originalIndex = $sortArray[$i][1]
    Local $fileName = $fileStats[$originalIndex][0]
    Local $count = $fileStats[$originalIndex][1]
    Local $totalSize = $fileStats[$originalIndex][2]
    Local $averageSize = $count > 0 ? Round($totalSize / $count, 2) : 0

    ; Форматируем строки для вывода
    ConsoleWrite(StringFormat("%-60s %-35d %-10s", $fileName, $count, $averageSize) & @CRLF)
Next
Спасибо - пошел разбиратся
 
Верх