Посчет числа строк в исходниках
Select messages from
# through # FAQ
[/[Print]\]

Total Commander -> Автоматизация Total Commander

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

#2:  Author: Tol!kLocation: Арзамас PostPosted: Tue Mar 03, 2009 22:01
    —
http://www.anycount.com/
Quote:
Free 30-day Trial

#3:  Author: prog_sanLocation: Пенза PostPosted: Tue Mar 03, 2009 23:12
    —
ok. Как вижу решений для TotalCommander готовом виде не имеется. Sad

#4:  Author: prog_sanLocation: Пенза PostPosted: Wed Mar 04, 2009 02:32
    —
Нашел отличное дополнение к VS. Line Counter By Jon Rista http://www.codeproject.com/KB/macros/LineCounterAddin.aspx
Космическая вещь.
А к TotalCommander напишу wdx плагин для просмотра статистики по конкретному файлу Smile

#5:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Mar 04, 2009 17:26
    —
prog_san
Используем Script Content Plugin:
Code:
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

Скорость не самая высокая, но работает Smile


Last edited by Batya on Thu Mar 05, 2009 14:58; edited 2 times in total

#6:  Author: VolniyLocation: Местный PostPosted: Wed Mar 04, 2009 19:41
    —
Batya wrote:
Скорость не самая высокая

Попробуй вот так:
Code:
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
Должно по идее заработать повеселей.

#7:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Mar 04, 2009 21:12
    —
Volniy wrote:
OTF.ReadAll

Я как раз боялся, что это сильно нагрузит память при больших файлах.
Ты считаешь, что это действительно лучше?

#8:  Author: VolniyLocation: Местный PostPosted: Thu Mar 05, 2009 02:27
    —
Обычно - да. Времена компьютеров с памятью в 4 МБ ушли в прошлое. Кроме того в каждый конкретный момент времени считанным в память является только один файл (кстати я не сохраняю содержимое файла в переменную). А если говорить об исходниках, то врядли кто-то станет работать с гигантскими файлами листингов, проект обычно разбивается на некоторое количество более мелких файлов.

А вообще нужно просто взять и попробовать, от теоретизирования тут мало толку.

#9:  Author: prog_sanLocation: Пенза PostPosted: Thu Mar 05, 2009 04:01
    —
Написал wcx плагин.
http://mhtunpack.narod.ru/wcx_LineCount-0.2.zip

Работает шустро, правда пока только для C и С++ проектов (анализируются файлы .c, .cpp, .h)
Плагин работает только с папками - выбираешь папку проекта, создаешь архив типа "line"(плагин вешается на этот тип) и архивируешь. Если необходима подробная статистика по подпапкам проекта - выбираешь галочку "recursively pack subdirectories". На выходе текстовый файл со статистикой проекта:
Code:
Files   Total Lines   Code Lines   Comments   Empty Lines   Ration %   Name
    5        928           495        299        177        53        LineCount

#10:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Mar 05, 2009 14:57
    —
Volniy
Volniy wrote:
А вообще нужно просто взять и попробовать

Хмм... И правда, значительно шустрее работает.
Скрипт выше поправил.

#11:  Author: prog_sanLocation: Пенза PostPosted: Thu Mar 05, 2009 23:04
    —
Batya
Спасибо, пробывал скрипт - понравилось.
Но плагин побыстрее считает.

#12:  Author: VolniyLocation: Местный PostPosted: Fri Mar 06, 2009 10:17
    —
Batya wrote:
Скрипт выше поправил.

А почему у тебя написано LinesInFile = OTF.Line - 1 . Почему ты решил одну строку в файле не брать в расчет?

#13:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Mar 06, 2009 14:05
    —
Volniy wrote:
А почему у тебя написано LinesInFile = OTF.Line - 1 .

А после чтения всего потока свойство Line возвращает номер на один больше, чем последняя строка. По крайней мере у меня. Проверь.



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group