Страница 1 из 1

Посчет числа строк в исходниках

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

Добавлено: Вт мар 03, 2009 21:01
Tol!k
http://www.anycount.com/
Free 30-day Trial

Добавлено: Вт мар 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 возвращает номер на один больше, чем последняя строка. По крайней мере у меня. Проверь.