Press "Enter" to skip to content

Zrzuć notatkę z kodu;)

Witajcie czytelnicy;)
Wiosenka przyszła to i mi się częściej pisać zachciało. Lody puściły, te sprawy. Dzisiaj mam dla was kawaluntek kodu, którego omówię dla treningu. Język oczywiście c#, acz można go łatwo przetłumaczyć na dowolny inny i to będzie działać, bez problemu. Zdaję sobie sprawę, że można to napisać w 3 linijkach, ale wtedy nie byłoby o czym opowiadać.

Wyobraźmy sobie taką sytuację. Siedzimy sobie w commandline, chcemy na szybko sobie zapisać jakąś notatkę.
Ale tak zupełnie na szybko. Wpisując notuj hehe i w notatce mamy hehe. Notatka jest tworzona na pulpicie (gdzie najłatwiej ją znaleźć). Nie wykrzacza się w momencie kiedy plik już istnieje, tylko szuka wolnej nazwy i się tworzy. Poniżej wklejam kod, a następnie go nieco omówię.

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace notuj
{
    class Sciezka
    {
        private string calasciezka;
        private string nazwapliku;
        private uint ilosc = 0;
        //Lokalizacja: pulpit aktualnie zalogowanego usera:)
        public readonly string Lokalizacja = Environment.GetEnvironmentVariable("HOMEDRIVE").ToString() + Environment.GetEnvironmentVariable("HOMEPATH").ToString() + "\\Desktop\\";
        public readonly string Prefix = "notatka_";    
        public string CalaSciezka { get { return calasciezka; } }
        public string Nazwapliku { get { return nazwapliku; } }
        public Sciezka()
        {
            ustaw();
        }

        private void ustaw()
        {
            nazwapliku = Prefix + ilosc + ".txt"; //.txt użyto jako stałej dosłownej, nie ma sensu zapisywać pliku tekstowego w innym formacie.
            calasciezka = Lokalizacja + Nazwapliku;
        }
        public void update()
        {
            ilosc++;
            ustaw();
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
                return;
            Sciezka sciezka = new Sciezka();
            foreach (string f in Directory.GetFiles(sciezka.Lokalizacja, sciezka.Prefix + "*.txt"))
            {
                sciezka.update();
            }
            while (Directory.GetFiles(sciezka.Lokalizacja, sciezka.Nazwapliku).Length != 0)
            {
                sciezka.update();

            }
            try
            {
                System.IO.StreamWriter file = new System.IO.StreamWriter(sciezka.CalaSciezka);
                foreach (string parametr in args)
                {
                    file.Write(parametr + " ", true);
                }
                file.Close();
            }
            catch (System.UnauthorizedAccessException) {
                Console.WriteLine("Nie możesz tu pisać. \n Prawdopobna przyczyna: dodaj aplikację do zaufanych w AV.");
            }
        }
    }
}

Klasa pomocnicza – Sciezka
Uznałam, że warto zgrupować zmienne i utworzyć z nich osobną klasę. Ma to swoją logikę, wszakże one opisują jedno coś – ścieżkę dostępu do naszej notatki, a także ją samą generują.
Mamy tu różne zmienne, jedne są podawane dosłownie, inne generowane raz a dobrze, jeszcze inne zmieniają się.
Można wyróżnić kilka sposobów dostępu do owych zmiennych:
1) zmienna ma być tylko do odczytu – praktycznie odczytać ją może ktokolwiek, ale tylko odczytać. Więc zamiast akcesora postanowiłam użyć publicznej zmiennej tylko do odczytu. Dokładanie metody do odczytania jej (czy akcesora) niepotrzebnie by tylko zaśmieciło. Oczywiście, puryści powiedzą „a co jak daną wartość zaczniesz przechowywać inaczej” – jednak trza się zastanowić, czy będzie w przyszłości taka potrzeba. Wtedy się zmieni:)
2) zmienna dostępna tylko w klasie – a więc prywatna o swobodnym dostępie.
3) Zmienna, która wewnątrz klasy jest ustawiana, zaś może być czytana poza nią – czyli mamy zmienną prywatną z publicznym akcesorem, posiadającym geta, a pozbawionym seta. Czyli: klasa ma dostęp swobodny, ale każdy inny może zmienną odczytać.
4) Zmiennych publicznych swobodnego dostępu nie ma – i w programowaniu obiektowym raczej ich być nie powinno, lub powinny być one rzadkie.
Dalej mamy już tylko metody klasy. Są one z resztą bardzo proste. Szukamy części wspólnych, potem wrzucamy je w metody, które następnie wywołujemy. Metody są dość proste. Ustaw ustawia nam nową nazwę ścieżki, zaś update aktualizuje stan obiektu (inkrementuje licznik będący ilością plików na dysku oraz ustawia funkcją ustaw nową wartość).

Przechodzimy do głównej funkcji programu.
Program działa tylko jeśli mu podamy jakiś parametr. Jeżeli mu nie podamy parametru – nie działa czyt. nic nie robi. Można tu wyrzucić komunikat na konsolę z info „użycie: notuj parametry”, ale to pominęłam, bo nie jest mi to potrzebne. Wiele programów bez parametrów nie robi nic i dopiero jak im damy „/?” Jeśli ktoś chce, może dopisać.

Dalej będziemy zakładać, że user jednak parametr podał.
Pierwsze co robimy to tworzymy obiekt będący instancją naszej klasy pomocniczej.
Potem (te 2 pętle) w zasadzie próbujemy ustalić nazwę dla naszego pliku z notatką. Najpierw przeszukujemy folder, by zliczyć pliki notatek. Jeśli notatek jest 5, ta nowa będzie szóstą i tak dalej. A co jeśli numerki były nie po kolei?
Za to odpowiada pętla while, która sprawdza, czy wygenerowana nazwa już istnieje. Jeśli tak, to po prostu bierze następną, aż nie znajdzie.
Następnie próbuje stworzyć plik, wpisać zawartość parametrów, oraz zamknąć plik.
Ostatnie co robimy, to łapiemy wyjątek UnauthorizedAccessException, żeby platforma nie pluła z powodu błędu zapisu.
Ot, i po kodziku:)

Z pewnością idzie jeszcze zoptymalizować, ale uważam, że najgorzej nie jest.
Pozdrawiam:)

PS: Dodam jeszcze, że jak chcecie łatwo użyć binarki, to zróbcie taki myk

set PATH=%PATH%;C:\notuj.exe

Oczywiście zamiast C:\notuj.exe podajcie rzeczywistą ścieżkę dostępu:)

PS2: Szybciej będzie echo notatka >plik ale co tam;p