| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| prog_san 
 
  
 Joined: 29 Sep 2007
 Posts: 284
 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: 284
 Location: Пенза
 
 | 
			
				|  (Separately) Posted: Tue Mar 03, 2009 23:12    Post subject: |   |  
				| 
 |  
				| ok. Как вижу решений для TotalCommander  готовом виде не имеется.  |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| prog_san 
 
  
 Joined: 29 Sep 2007
 Posts: 284
 Location: Пенза
 
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| Batya 
 
  
 Joined: 15 Dec 2004
 Posts: 2229
 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: 2229
 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: 284
 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: 2229
 Location: Москва, Россия
 
 | 
			
				|  (Separately) Posted: Thu Mar 05, 2009 14:57    Post subject: |   |  
				| 
 |  
				| Volniy 
  	  | Volniy wrote: |  	  | А вообще нужно просто взять и попробовать | 
 Хмм... И правда, значительно шустрее работает.
 Скрипт выше поправил.
 _________________
 Нет, я не сплю. Я просто медленно моргаю.
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| prog_san 
 
  
 Joined: 29 Sep 2007
 Posts: 284
 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: 2229
 Location: Москва, Россия
 
 | 
			
				|  (Separately) Posted: Fri Mar 06, 2009 14:05    Post subject: |   |  
				| 
 |  
				|  	  | Volniy wrote: |  	  | А почему у тебя написано LinesInFile = OTF.Line - 1 . | 
 А после чтения всего потока свойство Line возвращает номер на один больше, чем последняя строка. По крайней мере у меня. Проверь.
 _________________
 Нет, я не сплю. Я просто медленно моргаю.
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		|  |