DirectoryOpus - część 3 z 10


Jarosław Horodecki

Wersja HTML -




Zapoznaliśmy się już z ogólnymi zasadami działania Directory Opusa. Wiemy również, jak konstruować za pomocą programu konfiguracyjnego własne funkcje ukryte pod gadżetami. Tym razem zajmiemy się rozpoznawaniem typów plików oraz przykładami wykorzystania tej bardzo przydatnej funkcji realizowanej przez DOpus.



Obsługą różnych typów plików zajmuje się menu Filetypes programu konfiguracyjnego DOpusa. Dzieki zawartym w nim opcjom możemy również definiować wzorce plików, jakie program ma rozpoznawać, oraz działania, jakie ma podejmować po ich odnalezieniu.


Zacznijmy więc od definicji typów plików. Potrzebne opcje znajdują się w drugim rozwijanym menu, nazwanym CLASSES. Dostępne są w nim opcje umożliwiające tworzenie nowych typów (NEW), edycję już istniejących (EDIT) oraz kilka innych, nie wymagających chyba specjalnego objaśniania, funkcji. Przy definiowaniu własnych typów należy się oczywiście posłużyć opcją NEW. Powoduje ona przejście do ekranu zawierającego wszystkie opcje, za pomocą których podajemy DOpusowi parametry, na jakich podstawie będzie on rozpoznawał dany typ plików.


Na początku definiujemy nazwę grupy plików, wpisując ją w okienku podpisanym FILE CLASS, następnie należy podać skrótową nazwę określonego typu (CLASS ID). Można już przystąpić do definicji charakterystycznych cech danego typu plików. Dokonujemy tego poprzez wpisywanie odpowiednich komend do znajdującego się poniżej okienka. Pewną pomocą służyć tu może ich lista, dostępna po skorzystaniu z gadżetu z symbolem lupy.

Oto skrótowe opisy kolejnych komend:

MATCH -- umożliwia porównywanie z podanym wzorcem odpowiedniej liczby bajtów sprawdzanego pliku. Po tej komendzie umieszczamy łańcuch znaków, z którym dany plik będzie porównywany. Oprócz liter i innych znaków ASCII można również korzystać z kodów szesnastkowych, kodów dziesiętnych oraz jokera "?" mogącego zastąpić dowolny bajt. Przykładowo plik IFF można rozpoznać za pomocą sekwencji "form????ilbm". Każdy obrazek w IFF-ie zaczyna się właśnie od takich znaków. Oczywiście w miejscu znaku "?" normalnie występują znaki charakterystyczne dla danego obrazka, które jednak są przy rozpoznawaniu ignorowane. Inny przykład użycia tejże komendy to wpisanie sekwencji "$000003f3" -- tak właśnie zaczynają się wszystkie pliki uruchamialne z poziomu AmigaDOS-u (tzw. executables).

MATCHBITS -- sprawdza ustawienia bitów analizowanego pliku. Składnię tego rozkazu najlepiej chyba wyjaśnią proste przykłady: "+rw -e" -- muszą być włączone bity read oraz write, natomiast bit executable musi być wyłączony, ustawienia pozostałych bitów nie mają znaczenia. Na tej samej zasadzie można stworzyć dowolne ustawienia bitów odpowiadające tworzonemu typowi plików.

MATCHCOMMENT -- porównanie tekstu podanego jako argument z tekstem w komentarzu do danego pliku. Można oczywiście korzystać z dowolnych jokerów, takich jak znaki "#" oraz "?".

MATCHDATE -- porównanie podanego wzoru daty z datą analizowanego pliku. Jako argument można podać zarówno konkretną datę, jak i pewien przedział. Sposób określania przedziałów dat najprościej chyba będzie poznać na przykładzie. Gdy chcemy brać pod uwagę przy naszej selekcji jedynie pliki utworzone pomiędzy 14 sierpnia 1993, a 22 stycznia 1994, musimy podać następujący argument: "14-sept-93 < 22-jan-94". Znak "<" nie jest tu znakiem "mniejszy niż", ale po prostu oddziela podane daty graniczne. Można również wpisywać sekwencje: "< 22-jan-94", co spowoduje odnalezienie plików utworzonych do dnia 22 stycznia 1994 lub "14-sept-93 <", co z koleji spowoduje branie pod uwagę jedynie plików utworzonych po 14 sierpnia 1993 do dnia dzisiejszego.

MATCHNAME -- odnajdywanie pliku na podstawie jego nazwy. Dostępne są zarówno jokery typowe dla AmigaDOS-u ("#" oraz "?"), jak i znak "*". Rozpoznawanie plików na podstawie ich nazwy stosowane jest najczęściej i jest najprostszym, ale zarazem najbardziej zawodnym, sposobem. Zwykle w ten sposób można rozpoznawać na przykład archiwa ("*.lzh", "*.zip", "*.lha") czy moduły muzyczne ("mod.*").

MATCHSIZE -- rozpoznawanie pliku na podstawie jego długości. Można podać zarówno dokładną długość pliku, jak i pewien przedział. W argumencie tej komendy można korzystać ze znaków "<", ">" oraz "=".

Są to już wszystkie komendy porównań. Warto jednak zwrócić uwagę, iż komenda MATCH odnosi się jedynie do pierwszych bajtów danego pliku. Co jednak zrobić, kiedy o przynależności danego pliku do tworzonego typu plików decydują nie pierwsze jego bajty, ale ich sekwencje położone w innej części pliku lub też po prostu samo wystąpienie pewnej sekwencji bajtów w całej strukturze pliku. Otóż umożliwia to cały zestaw specjalnie do tego celu przygotowanych komend:

MOVETO -- przemieszczenie aktualnej pozycji sprawdzania do podanego miejsca. Jako argument podajemy miejsce w pliku, do jakiego ma zostać przemieszczony znacznik dla komendy MATCH.

MOVE -- komenda ta ma podobne działanie do MOVETO, z tym że zamiast przesuwania do zadanej pozycji bezwzględnej w danym pliku, znacznik przesuwany jest względem ostatniej pozycji o podaną liczbę bajtów (tzw. przesunięcie względne). Oczywiście dupuszczalne są tu również argumenty ujemne, aby dokonać przesunięcia do początku pliku.

SEARCHFOR -- poszukuje podanego łańcucha znaków, a po jego odnalezieniu ustawia znacznik na pozycji pierwszego bajtu z podanego łańcucha. Argument dla tej komendy jest podawany w ten sam sposób, co w komendzie MATCH.

Oprócz wymienionych komend istnieją jeszcze dwie instrukcje logiczne, służące do łączenia różnych kryteriów określających przynależność badanego pliku do danej grupy. Są to instrukcje:

AND -- połączone za pomocą tej instrukcji warunki muszą być spełnione. W przeciwnym wypadku analizowany plik nie jest brany pod uwagę.

OR -- tylko co najmniej jeden z połączonych warunków musi być spełniony, aby plik został sklasyfikowany jako przynależący do danego typu.

Po tej dość dużej dawce teorii warto chyba spróbować skonstruować własną grupę plików. W DOpusie jest już kilka typów zdefiniowanych standardowo, jednak z wyjątkiem typu "ikona" stosowana jest najprostsza metoda definicji, z rozpoznawaniem na podstawie nazwy pliku.

Proponuję więc stworzyć typ pliku odpowiadający obrazkom w formacie JPG. Najpierw musimy więc określić nazwę grupy plików oraz jej skrót (proponuję odpowiednio: "JPG Picture" oraz "JPG").

Następnie przechodzimy do podawania kryteriów służących do identyfikacji typu.

Pierwszą metodą będzie oczywiście odnalezienie rozszerzenia JPG, typowego dla tychże obrazków. Drugą, znacznie doskonalszą, rozpoznanie obrazka JPG poprzez odnalezienie w nim sekwencji znaków JFIF znajdującej się na określonej pozycji. Zaczynamy więc od wpisania komendy NATCHFILE *.JPG. Dzięki niej rozpoznajemy plik, odnajdując rozszerzenie. Następnie należy skorzystać z komendy OR, ponieważ posługujemy się dwoma równorzędnymi warunkami. Kolejną rzeczą będzie oczywiście odnalezienie sekwencji JFIF.

Aby prawidłowo określić pozycję tegoż łańcucha znaków, najprościej będzie posłużyć się narzędziem zajmującym całą górną część ekranu edycji typów plików, nazwanym FILE VIEWER. Za pomocą gadżetu z lupą wybieramy dowolny obrazek w formacie JPG i wczytujemy go. W dużym oknie pokaże się zawartość tego pliku (sposób jego wyświetlenia jest podobny do działania komendy HEX READ DOpusa). Teraz za pomocą myszy podwójnie klikamy nad literką J (początek JFIF). W okienku POSITION pokaże się liczba 6, co oznacza, że potrzebna nam sekwencja zaczyna się od siódmego (pozycje w pliku liczymy od zera) bajtu tego pliku. Aby ją odnaleźć, musimy więc skorzystać z komendy MOVETO 06, którą wstawiamy zaraz po OR. Na koniec wystarczy jeszcze zwykłe porównanie: MATCH JFIF. Należy pamiętać, aby argument tej ostatniej komendy był wpisany wielką literą. W ten sposób stworzyliśmy nowy typ pliku. Warto teraz zająć się praktycznym jego wykorzystaniem. W tym celu jednak musimy jeszcze zapoznać się z drugim edytorem, służącym do przyporządkowywania konkretnym rodzajom plików stosownych do nich działań.

Wybierzmy więc opcję NEW, znajdującą się w dolnej części ekranu w głównym menu FILETYPES. Pojawi się okienko z wyszczególnionymi dostępnymi rodzajami plików. Wybieramy oczywiście nasz "JPG Picture".

Pojawi się nie znany nam dotychczas ekran, pod pewnymi względami podobny jednak do omawianego w poprzedniej części edytora funkcji gadżetów. Właściwie to jedynie górna jego część różni się od dokładnie już omówionego edytora. Z samą definicją poszczególnych operacji nie powinno więc być większych problemów. Także gadżet EDIT CLASS, znajdujący się w prawej górnej części ekranu, nie wymaga już chyba omówienia. Po jego wybraniu po prostu przechodzimy do edycji typu plików, którą już szczegółowo omówiłem.

Pozostaje więc okienko w środkowej części ekranu, nazwane EVENTS. Znajduje się w nim spis możliwych do zdefiniowania działań, które mają być rozpoczęte po wykryciu danego typu plików. Pierwsze dwa ich rodzaje to reakcja na kliknięcie myszą nad danym plikiem, a następnie w drugim okienku oraz zwykłe podwójne kliknięcie nad danym plikiem. W wypadku naszego przykładowego obrazka w formacie JPG zdefiniujemy oczywiście reakcje na podwójne kliknięcie. Wybieramy więc z listy "double-click" i definiujemy odpowiednie działania. Do wyświetlania obrazków JPG bardzo dobrym narzędziem jest program ViewTek, którym posługuję się bardzo często. Warto więc podstawić go jako procedurę wyświetlającą obrazki JPG. Korzystając z informacji podanych w poprzedniej części, wpisujemy odpowiednie instrukcje oraz zgrywamy całą konfigurację na dysk.

Można już przetestować działanie zdefiniowanej komendy. Wybieramy z katalogu dowolny obrazek w formacie JPG i dwukrotnie klikamy nad nim myszką. Na ekranie powinien się po chwili pokazać wybrany obrazek. Warto zwrócić uwagę, iż dzięki rozpoznawaniu formatu JPG poprzez szukanie sekwencji JFIF DOpus prawidłowo rozpoznaje i wyświetla także obrazki bez odpowiedniego rozszerzenia w nazwie.

Spróbujmy jednak dodać do dowolnego innego pliku (na przykład tekstowego) rozszerzenie JPG -- DOpus, niestety, potraktuje ten plik jako obrazek i będzie próbował go wyświetlić. Jest jednak na to bardzo prosta rada. Można mianowicie z powodzeniem wyrzucić z definicji typu JPG rozpoznawanie go poprzez odnajdywanie odpowiedniego rozszezrzenia. Z powodzeniem wystarczy przecież odnalezienie sekwencji JFIF. Wykonajmy więc odpowiednie zmiany. Teraz już wszystko będzie działać prawidłowo.

Oczywiście nie jest to jedyne zastosowanie mechanizmu definiowania typów plików. Możliwości jest o wiele więcej, zwłaszcza gdy definiowanie typów plików połączymy z definicją własnych gadżetów. Więcej na temat zastosowania tego potężnego narzędzia w praktyce dowiemy się z następnej części cyklu.