log_to_file( const file[], const message[], [ ... ] )
Funkcja sklada sie z 2 czesci:
- Nazwa pliku (opcjonalnie sciezka) - przy nie podaniu sciezki zostanie stworzony(zapisany do) plik o podanej nazwie w folderze amxmodx/logs
Jesli chcemy by kazdy dzien mial osobny plik oraz by mozna bylo latwo je rozroznic musimy odpowiednio sformatowac nazwe pliku:
new file[32],Time[7] get_time("%d%m%y",Time,8) format(file,31,"TEST_%s.log",Time) log_to_file(file,"Test log")W efekcie zostanie kazdego dnia tworzony plik lub zapis do istniejacego pliku o podajen nazwie. W tym przypadku powstal by plik TEST_170409.log
Specyfikacjie funkcji get_time KLIK!
- Druga czesc sklada sie z informacji ktora chcemy wpisac do pliku.
Na poczatku kazdego nowego wpisu beda informacje typu data - godzina (nie musimy sami formatowac tej czesci):
L 04/17/2009 - 12:38:11:
Tekst ktory bedziemy wprowadzac do pliku mozna formatowac tak jak w funkcji Format np:
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("say /log","test") } public test(id) { new name[32],ip[32],sid[64] get_user_name(id,name,31) get_user_ip(id,ip,31,1) get_user_authid(id,sid,63) log_to_file("file.txt","Gracz %s %s %s - napisal /log",name,ip,sid) }
Teraz podam 3 czesto niezbedne funkcje do pracy na plikach, ale nie wystarczajace by cokolwiek wpisac/pobrac z pliku:
get_basedir( name[], len ) - sciezka do folderu .../amxmodx/
get_configsdir( name[], len ) -sciezka do folderu .../amxmodx/config/
get_datadir( name[], len ) - sciezka do folderu .../amxmodx/data/
Pierwszy parametr to nazwa tablicy, a drugu to ilosc elementow ktore mozna uzyc (o 1 mniej niz liczba przy deklarowaniu tablicy). dzięki tym funkcja jestesmy w stanie zawsze zapisac plik w tym samym miejscu na serwerze niezaleznie na jakim jest on robiony.
Kolejne przydatne funkcje:
file_exists ( const file[] ) - sprawdza czy istnieje plik o podanej nazwie i sciezce
dir_exists ( const dir[] ) - sprawdza czy podana sciezka istnieje. Jesli np. nie ma folderu w ktorym chcemy zapisac dane wystarczy go stworzyc:
mkdir ( const dirname[] ) - tworzy folder o podanej nazwie i sciezce
file_size ( const file[], [ flag ] ) - sprawdza rozmiar pliku:
- gdy flaga to liczba 0 to funkcja zwraca liczbe Bitow pliku
- gdy flaga to liczba 1 to funkcja zwraca liczbe lini w pliku
Teraz najpodstawowsze 2, moim zdaniem najbardzej przydatne funkcie do pracu na plikach:
- pierwszy parametr to nazwa pluku i sciezka do niego (trzeba go sformatowac za pomoca w/w funkcji)read_file ( const file[], line, text[], len, &txtLen ) - funkcja do czytania danych z pliku
- drugi parametr to nr. lini ktora chcemy czytac - pierwsza linia w pliku jest linia o numerze 0. Sama funkcja zwraca kolejna dostepna linie jesli jest dostepna lub 0 gdy czytana linia jest ostatnia linia w pliku
- trzeci parametr to tablica w ktorej beda przechowywane dane z podanej wczesniej lini pliku
- czwarty parametr to maksymalna ilosc danych ktore mozemy przechowywac w tablicy (1 mniej niz liczba podana przy deklaracji)
- ostatni, piaty parametr zwraca ilosc znakow ktore zostaly pobrane do tablicy (jesli naprzyklad tablica ma rozmiar 512 a pobralismy tylko 17 znakow, to w tej zmiennej bedzie przechowywana informacia ile znakow tablicy jest dla nas wazne).
Przyklad petli ktora bedzie czytac kazda linie pliku a nastepnie wykonywac "TWOJ KOD"
new line=0, file, text[128],chars do{ line = read_file(file,line,text,127,chars) /* TWOJ KOD */ } while(line!=0)Petla do while bedzie wykonywana do momentu gdy funkcja read_file zwroci liczbe 0 czyli dojdzie do konca pliku. Jesli szukamy konkretnej informacji w pliku, ktora sie znajduje w tylko 1 linki kodu, to po jej znalezieniu mozemy przerwac funkcjie za pomoca "break" dzięki temu mozemy za petla zapisac informacjie w ktorej lini znajduje sie np. dana mapa. Zapisana linia moze byc pozniej przydatna do aktualizacji danych.
- Pierwszy parametr to nazwa pliku i sciezka do niego (trzeba go odpowiednio sformatowac).write_file ( const file[], const text[], [ line ] ) - funkcja zapisuje informacje do podanego pliku lub go tworzy
- Drugi paramert to tablica znakowa ktora przechowuje dane ktore chcemy zapisac do pliku. Jesli nic nie wpiszemy to linia bedzie pusta - funkcja write_file nie dodaje wlasnego tekstu do zapisywanego pliku
- Trzeci parametr to nr. lini w ktorej ma byc zapisana informacja linie sie zaczynaja od nr.0 - podajac konkretna linie, informacje ktore sa w niej przechowywane zostana usuniete i w danej lini zostana wprowadzone nasze nowe dane. Jesli paramet line bedzie rowny -1 to tekst bedzie zapisany na koncu pliku, bez nadpisywnia zadnych danych.
Uwagi:
- moga wystapic problemu w pracy na plikach na serwerach na ktorych chmod nie pozwala amxx'owi na zapis/czytanie/tworzenie plikow
- moga wystapic problemy przy formatowaniu sciezki na rozych systemach operacyjnych ( linux i windows rozdzielaja foldery za pomoca / oraz - mozna sprawdzic typ serwera za pomoca funkcji is_linux_server())
- tutorial zostal napisany na bazie "AMX Mod X Function Reference" oraz mojego doswiadczenia w tej dziedzinie. Podany kod nie moze stanowic samodzielnego pluga, trzeba go dostosowac do wlasnych potrzeb.
- Jesli sa pytania/uwagi proszę pisac w tym temacie
- Napisane dla http://www.amxx.pl nie kopiowac bez mojej zgody (czyt. autora).
- Jesli jakis mod mysli, ze tut jest nie czytelnie napisany lub sa bledy natury nie merytorycznej, tp jest proszony o poprawienie a nie pisanie zbednego posta ;-)