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

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Ответить
Аватара пользователя
prog_san
Сообщения: 285
Зарегистрирован: Сб сен 29, 2007 00:52
Откуда: Пенза

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

Сообщение prog_san »

Доброго времени суток!
Поставлена задача - подсчитать число строк во всех исходниках огромного проекта. Подскажите способрешения задачи.
На выходе должен получить либо файл с "деревом" каталогов сорцов и количеством строк для каждой папки, либо еще какой-нибудь вариант.
Вообще кто-нибудь сталктвался с подсчетом строк в большом количестве исходных файлов? На форуме посмотрел -подходящего wdx плагина не нашел. Наверное придется писать wcx плагин для решения задачи.
Хочется узнать, может быть существуют уже готовые решения этой проблемы..
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

http://www.anycount.com/
Free 30-day Trial
Аватара пользователя
prog_san
Сообщения: 285
Зарегистрирован: Сб сен 29, 2007 00:52
Откуда: Пенза

Сообщение prog_san »

ok. Как вижу решений для TotalCommander готовом виде не имеется. :(
Аватара пользователя
prog_san
Сообщения: 285
Зарегистрирован: Сб сен 29, 2007 00:52
Откуда: Пенза

Сообщение prog_san »

Нашел отличное дополнение к VS. Line Counter By Jon Rista http://www.codeproject.com/KB/macros/Li ... Addin.aspx
Космическая вещь.
А к TotalCommander напишу wdx плагин для просмотра статистики по конкретному файлу :)
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение 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
Скорость не самая высокая, но работает :)
Последний раз редактировалось Batya Чт мар 05, 2009 13:58, всего редактировалось 2 раза.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение 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
Должно по идее заработать повеселей.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Volniy писал(а):OTF.ReadAll
Я как раз боялся, что это сильно нагрузит память при больших файлах.
Ты считаешь, что это действительно лучше?
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение Volniy »

Обычно - да. Времена компьютеров с памятью в 4 МБ ушли в прошлое. Кроме того в каждый конкретный момент времени считанным в память является только один файл (кстати я не сохраняю содержимое файла в переменную). А если говорить об исходниках, то врядли кто-то станет работать с гигантскими файлами листингов, проект обычно разбивается на некоторое количество более мелких файлов.

А вообще нужно просто взять и попробовать, от теоретизирования тут мало толку.
Аватара пользователя
prog_san
Сообщения: 285
Зарегистрирован: Сб сен 29, 2007 00:52
Откуда: Пенза

Сообщение 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 
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Volniy
Volniy писал(а):А вообще нужно просто взять и попробовать
Хмм... И правда, значительно шустрее работает.
Скрипт выше поправил.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
prog_san
Сообщения: 285
Зарегистрирован: Сб сен 29, 2007 00:52
Откуда: Пенза

Сообщение prog_san »

Batya
Спасибо, пробывал скрипт - понравилось.
Но плагин побыстрее считает.
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение Volniy »

Batya писал(а):Скрипт выше поправил.
А почему у тебя написано LinesInFile = OTF.Line - 1 . Почему ты решил одну строку в файле не брать в расчет?
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Volniy писал(а):А почему у тебя написано LinesInFile = OTF.Line - 1 .
А после чтения всего потока свойство Line возвращает номер на один больше, чем последняя строка. По крайней мере у меня. Проверь.
Нет, я не сплю. Я просто медленно моргаю.
Ответить