View previous topic :: View next topic |
Author |
Message |
prog_san
Joined: 29 Sep 2007 Posts: 282 Location: Пенза
|
(Separately) Posted: Tue Mar 03, 2009 21:20 Post subject: Посчет числа строк в исходниках |
|
|
Доброго времени суток!
Поставлена задача - подсчитать число строк во всех исходниках огромного проекта. Подскажите способрешения задачи.
На выходе должен получить либо файл с "деревом" каталогов сорцов и количеством строк для каждой папки, либо еще какой-нибудь вариант.
Вообще кто-нибудь сталктвался с подсчетом строк в большом количестве исходных файлов? На форуме посмотрел -подходящего wdx плагина не нашел. Наверное придется писать wcx плагин для решения задачи.
Хочется узнать, может быть существуют уже готовые решения этой проблемы.. |
|
Back to top |
|
|
Tol!k
Joined: 01 Apr 2008 Posts: 1727 Location: Арзамас
|
|
Back to top |
|
|
prog_san
Joined: 29 Sep 2007 Posts: 282 Location: Пенза
|
(Separately) Posted: Tue Mar 03, 2009 23:12 Post subject: |
|
|
ok. Как вижу решений для TotalCommander готовом виде не имеется. |
|
Back to top |
|
|
prog_san
Joined: 29 Sep 2007 Posts: 282 Location: Пенза
|
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2221 Location: Москва, Россия
|
(Separately) Posted: Wed Mar 04, 2009 17:26 Post subject: |
|
|
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 |
Скорость не самая высокая, но работает _________________ Нет, я не сплю. Я просто медленно моргаю.
Last edited by Batya on Thu Mar 05, 2009 14:58; edited 2 times in total |
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Wed Mar 04, 2009 19:41 Post subject: |
|
|
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 | Должно по идее заработать повеселей. |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2221 Location: Москва, Россия
|
(Separately) Posted: Wed Mar 04, 2009 21:12 Post subject: |
|
|
Volniy wrote: | OTF.ReadAll |
Я как раз боялся, что это сильно нагрузит память при больших файлах.
Ты считаешь, что это действительно лучше? _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Thu Mar 05, 2009 02:27 Post subject: |
|
|
Обычно - да. Времена компьютеров с памятью в 4 МБ ушли в прошлое. Кроме того в каждый конкретный момент времени считанным в память является только один файл (кстати я не сохраняю содержимое файла в переменную). А если говорить об исходниках, то врядли кто-то станет работать с гигантскими файлами листингов, проект обычно разбивается на некоторое количество более мелких файлов.
А вообще нужно просто взять и попробовать, от теоретизирования тут мало толку. |
|
Back to top |
|
|
prog_san
Joined: 29 Sep 2007 Posts: 282 Location: Пенза
|
(Separately) Posted: Thu Mar 05, 2009 04:01 Post subject: |
|
|
Написал 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 |
|
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2221 Location: Москва, Россия
|
(Separately) Posted: Thu Mar 05, 2009 14:57 Post subject: |
|
|
Volniy
Volniy wrote: | А вообще нужно просто взять и попробовать |
Хмм... И правда, значительно шустрее работает.
Скрипт выше поправил. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
prog_san
Joined: 29 Sep 2007 Posts: 282 Location: Пенза
|
(Separately) Posted: Thu Mar 05, 2009 23:04 Post subject: |
|
|
Batya
Спасибо, пробывал скрипт - понравилось.
Но плагин побыстрее считает. |
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Fri Mar 06, 2009 10:17 Post subject: |
|
|
Batya wrote: | Скрипт выше поправил. |
А почему у тебя написано LinesInFile = OTF.Line - 1 . Почему ты решил одну строку в файле не брать в расчет? |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2221 Location: Москва, Россия
|
(Separately) Posted: Fri Mar 06, 2009 14:05 Post subject: |
|
|
Volniy wrote: | А почему у тебя написано LinesInFile = OTF.Line - 1 . |
А после чтения всего потока свойство Line возвращает номер на один больше, чем последняя строка. По крайней мере у меня. Проверь. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
|