private static void ChooseDirectionDirectory(string[] extArr) { long commentsChars = 0; long commentsLines = 0; long codeLines = 0; long codeChars = 0; long filesSkiped = 0; long fileScaned = 0; long miliseconds = 0; var q = '"'.ToString(); Console.Clear(); Console.Write("\r\nWskaż katalog w którym znajdują się pliki: "); string directoryPath = Console.ReadLine(); directoryPath = directoryPath.Replace(q, null); Console.Write("\r\n\r\nPodaj wartość identifikującą pliki które mają zostać zliczone: "); string identifier = Console.ReadLine(); var Mourinho = 1; //Mając te wartości tworzymy obiekt, na którym będzie operował główny silnik programu, ale żeby to zrobić musimy zebrać wszystkie pliki... foreach (var e in extArr) { string searchPattern = "*." + e; var pliki = Directory.GetFileSystemEntries(directoryPath, searchPattern, SearchOption.AllDirectories); var obiektUstawien = new SettingsObject() { Identyfikator = identifier, Pliki = pliki }; //I w tym momencie przechodzimy dalej... var result = Main_ENGINE(obiektUstawien); //Teraz sprawdzamy i wyświetlamy wyniki: Console.WriteLine("KROK [" + Mourinho + " Z " + extArr.Length + "]"); Mourinho++; Console.WriteLine("Wyniki dla plików z rozszerzeniem (*." + e + "): \r\n"); Console.WriteLine("Przeskanowane pliki: " + result.fileScaned); Console.WriteLine("Pominięte pliki: " + result.filesSkiped); Console.WriteLine("Wiersze komentarzy: " + result.commentsLines); Console.WriteLine("Znaki komentarzy: " + result.commentsChars); Console.WriteLine("Wiersze kodu: " + result.codeLines); Console.WriteLine("Znaki kodu: " + result.codeChars); Console.WriteLine("\r\n\r\n"); //I jeszcze uzupełnimy sobie globalne wartości fileScaned += result.fileScaned; filesSkiped += result.filesSkiped; commentsLines += result.commentsLines; commentsChars += result.commentsChars; codeLines += result.codeLines; codeChars += result.codeChars; miliseconds += result.miliseconds; } //Skanowanie ukończone! wl("\r\n\r\nUkończono skanowanie plików w katalogu!"); //Teraz sprawdzamy czy programista chce poznać statystyki godzinowe Console.Write("\r\nCzy chcesz wprowadzić więcej danych, aby poznać dokładne statystyki? [T/N]: "); string readed = Console.ReadLine(); if (readed.ToUpper()[0] == 'T' || readed.ToUpper()[0] == 'Y') { Console.Write("\r\nWprowadź liczbę przepracowanych godzin: "); float workedHours = int.Parse(Console.ReadLine()); Console.Write("\r\nWprowadź swoją stawkę godzinową: "); float pricePerHour = int.Parse(Console.ReadLine()); wl("Przeskanowane pliki: " + fileScaned); wl("Pominięte pliki: " + filesSkiped); wl("Liczba wierszy komentarza: " + commentsLines); wl("Liczba znaków komentarza: " + commentsChars); wl("Liczba wierszy kodu: " + codeLines); wl("Liczba znaków kodu: " + codeChars); wl("Średnia liczba znaków w wierszu kodu: " + codeChars / codeLines + " znaki"); //I teraz podajemy dane statystyczne wl("Liczba linii kodu na godzinę: " + Math.Round((codeLines / workedHours), 2) + " linii"); wl("Liczba linii komentarza na godzinę: " + Math.Round((commentsLines / workedHours), 2) + " linii"); wl("Liczba linii na godzinę: " + Math.Round((commentsLines + codeLines) / workedHours, 2) + " linii"); wl("Średnia cena za linię kodu: " + Math.Round((workedHours * pricePerHour) / (codeLines), 2) + " zł"); wl("Średnia cena za linię komentarza: " + Math.Round((workedHours * pricePerHour) / (commentsLines), 2) + " zł"); wl("Średnia cena za linię: " + Math.Round((workedHours * pricePerHour) / (commentsLines + codeLines), 2) + " zł"); wl("Średnia cena za znak kodu: " + Math.Round((workedHours * pricePerHour) / codeChars, 2) + " zł"); wl("\r\n\r\nDziękujemy za skorzystanie z programu!"); wl("http://www.codli.eu\r\n"); } else { wl("Przeskanowane pliki: " + fileScaned); wl("Pominięte pliki: " + filesSkiped); wl("Liczba wierszy komentarza: " + commentsLines); wl("Liczba znaków komentarza: " + commentsChars); wl("Liczba wierszy kodu: " + codeLines); wl("Liczba znaków kodu: " + codeChars); wl("Średnia liczba znaków w wierszu kodu: " + codeChars / codeLines + " znaki"); wl("\r\n\r\nDziękujemy za skorzystanie z programu!"); wl("http://www.codli.eu\r\n"); } Console.ReadLine(); }
private static MainEngineResult Main_ENGINE(SettingsObject info) { if (MierzenieSzczegolwe == true) { wl("\r\nRozpoczonam pomiary kodów...\r\n"); } //Tworzenie zmiennych pomiaru metryki long commentsChars = 0; long commentsLines = 0; long codeLines = 0; long codeChars = 0; long filesSkiped = 0; long fileScaned = 0; long commentsCharsBefore = 0; long commentsLinesBefore = 0; long codeLinesBefore = 0; long codeCharsBefore = 0; var listaMetryczna = new List <MetricObject>(); //I teraz bardzo prosty silnik, działający na typach IEnumerable foreach (var plik in info.Pliki) { //Zerujemy wartości dla pliku commentsCharsBefore = commentsChars; commentsLinesBefore = commentsLines; codeLinesBefore = codeLines; codeCharsBefore = codeChars; if (MierzenieSzczegolwe == true) { wl("Sprawdzam plik: " + plik + "..."); } var lines = File.ReadAllLines(plik); //Zanim przejdziemy do pętli iteracyjnej, sprawdzamy czy plik kwalifikuje się do sprawdzenia if (lines.Length == 0) { continue; } if (lines[0].Contains(info.Identyfikator) == false) { //Niestety, plik nie kwalifikuje się do sprawdzenia if (MierzenieSzczegolwe == true) { wl("Plik został pominięty, ponieważ nie zawierał odpowiedniego identyfikatora!\r\n"); } filesSkiped++; continue; } //Jeżeli doszliśmy tutaj, znaczy że plik nadaje się do sprawdzenia if (MierzenieSzczegolwe == true) { wl("Plik poprawny! Rozpoczynam wyliczanie metryki kodu..."); } fileScaned++; foreach (var wiersz in lines) { var clearLine = wiersz; /*Jeżeli linia jest pusta, po prostu ją pomijamy. * if (String.IsNullOrEmpty(wiersz) == true) * continue; * * //Tworzymy linię bez spacji na końcu i początku * var clearLine = RemoveSpacesAtBeginAndEnd(wiersz);*/ if (String.IsNullOrEmpty(wiersz) == true || String.IsNullOrWhiteSpace(wiersz) == true) { continue; } //Teraz sprawdzamy czy wiersz nie jest w całości komentarzem string twoFirst = String.Empty; if (clearLine.Length > 1) { twoFirst = clearLine[0].ToString() + clearLine[1].ToString(); } else { twoFirst = clearLine[0].ToString(); } if (twoFirst == "//" || twoFirst == "/*" || twoFirst == "<!" || wiersz[0] == '*') { //Spotykamy się z komentarzem w całym wierszu... commentsChars += clearLine.Length; commentsLines++; continue; } //Jeżeli jeszcze tu jesteśmy, całą linię liczymy jako kod codeChars += clearLine.Length; codeLines++; } //Teraz dodajemy do listy metrycznej dane o pliku listaMetryczna.Add(new MetricObject() { FileName = Path.GetFileName(plik), codeChars = codeChars - codeCharsBefore, codeLines = codeLines - codeLinesBefore, commentChars = commentsChars - commentsCharsBefore, commentLines = commentsLines - commentsLinesBefore }); //I wyświetlamy informację dla użytkownika if (MierzenieSzczegolwe == true) { wl("Liczba znaków komentarza w pliku: " + (commentsChars - commentsCharsBefore)); wl("Liczba wierszy komentarza w pliku: " + (commentsLines - commentsLinesBefore)); wl("Liczba znaków kodu w pliku: " + (codeChars - codeCharsBefore)); wl("Liczba wierszy kodu w pliku: " + (codeLines - codeLinesBefore)); wl("Liczba znaków komentarza dotychczas: " + commentsChars); wl("Liczba wierszy komentarza dotychczas: " + commentsLines); wl("Liczba znaków kodu dotychczas: " + codeChars); wl("Liczba wierszy kodu dotychczas: " + codeLines); wl("Przechodzę do kolejnego pliku... \r\n"); } } //I zwracamy wynik... var wynik = new MainEngineResult() { codeChars = codeChars, codeLines = codeLines, commentsChars = commentsChars, commentsLines = commentsLines, fileScaned = fileScaned, filesSkiped = filesSkiped, miliseconds = 0 }; return(wynik); }