Страница 1 из 1
Посчет числа строк в исходниках
Добавлено: Вт мар 03, 2009 20:20
prog_san
Доброго времени суток!
Поставлена задача - подсчитать число строк во всех исходниках огромного проекта. Подскажите способрешения задачи.
На выходе должен получить либо файл с "деревом" каталогов сорцов и количеством строк для каждой папки, либо еще какой-нибудь вариант.
Вообще кто-нибудь сталктвался с подсчетом строк в большом количестве исходных файлов? На форуме посмотрел -подходящего wdx плагина не нашел. Наверное придется писать wcx плагин для решения задачи.
Хочется узнать, может быть существуют уже готовые решения этой проблемы..
Добавлено: Вт мар 03, 2009 21:01
Tol!k
Добавлено: Вт мар 03, 2009 22:12
prog_san
ok. Как вижу решений для TotalCommander готовом виде не имеется.

Добавлено: Ср мар 04, 2009 01:32
prog_san
Нашел отличное дополнение к VS. Line Counter By Jon Rista
http://www.codeproject.com/KB/macros/Li ... Addin.aspx
Космическая вещь.
А к TotalCommander напишу wdx плагин для просмотра статистики по конкретному файлу

Добавлено: Ср мар 04, 2009 16:26
Batya
prog_san
Используем
Script Content Plugin:
Код: Выделить всё
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
content = Result
Set FSO = Nothing
Function Result
If FSO.FileExists(filename) Then
Result = LinesInFile(filename)
ElseIf FSO.FolderExists(filename) Then
Result = LinesInFolder(filename)
End If
End Function
Function LinesInFile(byVal pFile)
Dim OTF
On Error Resume Next
Set OTF = FSO.OpenTextFile(pFile, ForReading, False)
If Err.Number = 0 Then
OTF.ReadAll
LinesInFile = OTF.Line - 1
OTF.Close
Else
LinesInFile = 0
End If
On Error GoTo 0
Set OTF = Nothing
End Function
Function LinesInFolder(byVal pFolder)
Dim l, lf, lff
l = 0
On Error Resume Next
Set lff = FSO.GetFolder(pFolder)
If Err.Number = 0 Then
For Each lf In lff.Files
l = l + LinesInFile(lf)
Next
For Each lf In lff.SubFolders
l = l + LinesInFolder(lf)
Next
LinesInFolder = l
Else
LinesInFolder = 0
End If
Set lff = Nothing
End Function
Скорость не самая высокая, но работает

Добавлено: Ср мар 04, 2009 18:41
Volniy
Batya писал(а):Скорость не самая высокая
Попробуй вот так:
Код: Выделить всё
Function LinesInFile(pFile)
Dim OTF
On Error Resume Next
Set OTF = FSO.OpenTextFile(pFile, ForReading, False)
If Err.Number = 0 Then
OTF.ReadAll
LinesInFile = OTF.Line
OTF.Close
Else
LinesInFile = 0
End If
End Function
Должно по идее заработать повеселей.
Добавлено: Ср мар 04, 2009 20:12
Batya
Volniy писал(а):OTF.ReadAll
Я как раз боялся, что это сильно нагрузит память при больших файлах.
Ты считаешь, что это действительно лучше?
Добавлено: Чт мар 05, 2009 01:27
Volniy
Обычно - да. Времена компьютеров с памятью в 4 МБ ушли в прошлое. Кроме того в каждый конкретный момент времени считанным в память является только один файл (кстати я не сохраняю содержимое файла в переменную). А если говорить об исходниках, то врядли кто-то станет работать с гигантскими файлами листингов, проект обычно разбивается на некоторое количество более мелких файлов.
А вообще нужно просто взять и попробовать, от теоретизирования тут мало толку.
Добавлено: Чт мар 05, 2009 03:01
prog_san
Написал wcx плагин.
http://mhtunpack.narod.ru/wcx_LineCount-0.2.zip
Работает шустро, правда пока только для C и С++ проектов (анализируются файлы .c, .cpp, .h)
Плагин работает только с папками - выбираешь папку проекта, создаешь архив типа "line"(плагин вешается на этот тип) и архивируешь. Если необходима подробная статистика по подпапкам проекта - выбираешь галочку "recursively pack subdirectories". На выходе текстовый файл со статистикой проекта:
Код: Выделить всё
Files Total Lines Code Lines Comments Empty Lines Ration % Name
5 928 495 299 177 53 LineCount
Добавлено: Чт мар 05, 2009 13:57
Batya
Volniy
Volniy писал(а):А вообще нужно просто взять и попробовать
Хмм... И правда, значительно шустрее работает.
Скрипт выше поправил.
Добавлено: Чт мар 05, 2009 22:04
prog_san
Batya
Спасибо, пробывал скрипт - понравилось.
Но плагин побыстрее считает.
Добавлено: Пт мар 06, 2009 09:17
Volniy
Batya писал(а):Скрипт выше поправил.
А почему у тебя написано
LinesInFile = OTF.Line - 1 . Почему ты решил одну строку в файле
не брать в расчет?
Добавлено: Пт мар 06, 2009 13:05
Batya
Volniy писал(а):А почему у тебя написано LinesInFile = OTF.Line - 1 .
А после чтения всего потока свойство Line возвращает номер на один больше, чем последняя строка. По крайней мере у меня. Проверь.