Lucrul cu fișiere și directoare - comunitatea rusă pentru scripting amxx

Lucrul cu directoarele
Cod: Selectați toate read_dir (const dirname # 91; # 93; poz. producție # 91; # 93; len. outlen)
Această funcție este utilizată pentru a citi conținutul unui director. Funcția returnează indexul următorului element din dosar sau 0 dacă se ajunge la sfârșitul directorului și fișierele nu mai există.
Notă: Această funcție este ineficientă și în schimb se recomandă utilizarea funcției open_dir.
Cod: Selectați toate dir_exists (const dir # 91; # 93;)
Această funcție este creată pentru a verifica dacă există directorul specificat. Returnează 1 dacă există directorul sau 0 altfel.
Cod: Selectați toate rmdir (const # 91; # 93;)
Această funcție este utilizată pentru a șterge directorul. Dacă directorul conține fișiere, nu îl puteți șterge.
Cod: Selectați toate mkdir (const dirname # 91; # 93;)
Această funcție este utilizată pentru a crea un director. Se întoarce 0 la succes.
Cod: Selectați toate open_dir (dir # 91; # 93; primul fișier # 91; # 93; lungime)
Această funcție este utilizată pentru a deschide un director pentru citire. Returnează un pointer în director sau 0 altfel. Prin specificarea directorului în parametrul dir. se presupune că sunteți în directorul mod (de exemplu, cstrike). Dar puteți ieși din director și nivelurile de mai sus (folosind ./), de exemplu:
Cod: Selectați toate
noul i_Dir. s_File # 91; 128 # 93;
i_Dir = open_dir ( "../". s_File. charsmax (s_File))

Suntem deja în directorul principal al serverului, unde se află hlds.exe. Dar există o limită, nu puteți trece dincolo de partiția logică în care serverul este localizat pe hard disk.
Cod: Selectați toate următoarea fișier (bufferul dir # 91; # 93; lungime)
Această funcție citește următorul fișier de la pointerul specificat la director. Returnează 1 dacă este reușit sau 0 altfel.
Cod: Selectați toate close_dir (dirh)
Închide dosarul la indexul specificat. Trebuie să utilizați funcția pe pointerul corect obținut în open_dir.

De exemplu, vom scrie un plugin care va citi toate hărțile din director. / cstrike / maps și le trimiteți la consola de servere:
Cod: Selectați toate #include

#define PLUGIN "Citiți hărți"
#define VERSION "1.0"
#define AUTOR "DJ_WEST"

public plugin_init ()
register_plugin (PLUGIN.VERSION.AUTHOR)

noul i_Dir. s_File # 91; 128 # 93;

// Salvați cursorul la directorul cstrike / maps în i_Dir
i_Dir = open_dir ("hărți". s_File. charsmax (s_File))

// Verificați dacă există directorul
dacă (i_Dir)
server_print ("*** HARTA ***")

// Atata timp cat next_file returneaza valori! = 0 vom scoate harta in consola
în timp ce (next_file (i_Dir.s_File.charsmax (s_File)))
// Verificați dacă primul caracter al fișierului este ".", Apoi nu imprimați
// Funcția citește "." și "..", care nu sunt fișiere,
// dar pur și simplu spuneți că există un nivel de director mai mare
dacă (s_File # 91; 0 # 93; == '.' )
continua

// Verificați dacă fișierul conține .bsp, care ne spune că aceasta este o hartă
// Deoarece pot exista alte fișiere sau directoare în director
dacă (containi (s_File ".bsp")! = - 1)
server_print (s_File)
>
>
>

Lucrul cu fișiere (mod vechi)
Cod: Selectați toate fișierele_există (fișier const # 91; # 93;)
Această funcție este utilizată pentru a verifica dacă există fișierul specificat. Returnează 1 dacă există sau 0 altfel.
Cod: Selectați toate delete_file (fișier const # 91; # 93;)
Această funcție este utilizată pentru a șterge fișierul specificat. Returnează 1 dacă este reușit sau 0 altfel.
Cod: Selectați toate fișierele read_file (fișier const # 91; # 93; linie. text # 91; # 93; len. txtlen)
Această funcție este utilizată pentru a citi o linie într-un fișier. Returnează indexul la următoarea linie sau la sfârșitul fișierului. Liniile din fișiere încep cu numerele 0. Șirul specificat (parametrul de linie) este citit în text cu lungimea specificată len. Numărul de caractere citite este stocat în txtLen.
Cod: Selectați toate fișierul write_file (fișier const # 91; # 93; text const # 91; # 93; linia = - 1)
Această funcție este utilizată pentru a scrie o linie într-un fișier în locația specificată. Returnează 0 dacă execuția eșuează. Dacă linia este -1, atunci linia va fi scrisă la sfârșitul fișierului. Funcția creează automat un fișier dacă nu există.
Cod: Selectați toate rename_file (const oldname # 91; # 93 ;, const nou nume # 91; # 93; relativă = 0)
Această funcție este utilizată pentru a redenumi un fișier. Returnează 1 dacă este reușit sau 0 altfel. Dacă relația nu este 0, atunci directorul curent este considerat directorul mod. În caz contrar, directorul curent nu este definit (dar este directorul serverului HLDS).
Cod: Selectați toate file_size (fișier const # 91; # 93; flag = 0)
Această funcție returnează dimensiunea fișierului. Dacă steagul:
0 - dimensiunea fișierului în octeți
1 - numărul de linii din fișier
2 - returnează 1 dacă fișierul se termină cu o traducere a liniei
Dacă fișierul nu există, acesta returnează -1.
Cod: Selectați toată dimensiunea fișierului (const nume fișier # 91; # 93; orice. )
Această funcție returnează dimensiunea fișierului. numele fișierului poate fi format din formatul de stil, adică să specificați variabilele în orice.


Scrieți în fișier datele din fluxul masiv cu dimensiunea blocului în modul.
Modurile modurilor disponibile:
BLOCK_INT - pentru a scrie orice număr sau caractere
BLOCK_SHORT - pentru a scrie caractere și valori în -32767 -> 32767
BLOCK_CHAR - pentru scrierea de caractere și valori în -127 -> 127
BLOCK_BYTE - similar cu BLOCK_CHAR
Returnează numărul blocurilor scrise cu succes.
Cod: Selectați toate fișierele fprintf (fișier Const fmt # 91; # 93; orice. )
Această funcție este utilizată pentru a scrie șirul generat într-un fișier.
Cod: Selectați toate fișierele (fișierul, poziția Start)
Această funcție este utilizată pentru a seta poziția curentă a cursorului în fișier. poziția este deplasarea de la început. începe poate fi:
SEEK_SET - începutul fișierului
SEEK_CUR - poziția curentă a cursorului
SEEK_END - sfârșitul fișierului
Cod: Selectați toate ftell (fișier)
Această funcție este utilizată pentru a readuce poziția curentă a cursorului la un fișier.
Cod: Selectați toate fișierele (fișierul Tampon # 91; # 93; lungimea maximă)
Această funcție este utilizată pentru a citi o linie dintr-un fișier. Citește de asemenea caractere și caractere noi.
Cod: Selectați toate fișierele fgetc (fișier)
Această funcție este utilizată pentru a citi un caracter (1 octet) dintr-un fișier de la pointerul specificat la acesta.
Cod: Selectați toate fgetf (fișier)
Această funcție este utilizată pentru a citi valoarea float (4 octeți, 8 până la AMD64) din fișierul de la pointerul specificat la ea. Această funcție a fost eliminată în AMXX 1.1.
Cod: Selectați toate fișierele (fișier)
Această funcție este folosită pentru citirea unei valori întregi (4 octeți) dintr-un fișier de la pointerul specificat la acesta. Această funcție a fost eliminată în AMXX 1.1.
Cod: Selectați toate fgetl (fișier)
Această funcție este utilizată pentru a citi o valoare lungă (4 octeți) dintr-un fișier de la pointerul specificat la acesta. Această funcție a fost eliminată în AMXX 1.1.
Cod: Selectați toate fișierele (fișierul. Const text # 91; # 93;)
Această funcție este utilizată pentru a scrie o linie la un fișier la poziția curentă a cursorului de fișier. Returnează numărul de caractere scrise cu succes.
Cod: Selectați toate fișierele fputc (fișier)
Această funcție este creată pentru a scrie un caracter (1 octet) într-un fișier de la indicatorul specificat.
Cod: Selectați toate fișierele (fișier)
Această funcție este folosită pentru a scrie valoarea float (4 octeți, 8 la AMD64) într-un fișier de la pointerul specificat. Această funcție a fost eliminată în AMXX 1.1.
Cod: Selectați toate fputi (fișier)
Această funcție este utilizată pentru a scrie o valoare întreagă (4 octeți) unui fișier la indicatorul specificat. Această funcție a fost eliminată în AMXX 1.1.
Cod: Selectați toate fișierele (fișier)
Această funcție este utilizată pentru a scrie o valoare lungă (4 octeți) într-un fișier de la pointerul specificat. Această funcție a fost eliminată în AMXX 1.1.
Cod: Selectați toate fungetc (fișierele de date)
Această funcție este utilizată pentru a stoca un caracter (1 byte) în date.

De exemplu, un plug-in care utilizează citirea RAW și scrierea, menținerea Steam, porecla, ucide și ucide jucători care pe stats.dat de server, precum și citirea acestora, după o schimbare de hartă (stats.dat va păstra statisticile de jucători care joacă pe server momentul curent pentru o singură carte):
Cod: Selectați toate #include

#define PLUGIN "Bază de date pentru jucător"
#define VERSION "1.0"
#define AUTOR "DJ_WEST schnitzelmaker "

#define MAX_PLAYERS 32

noul g_FileName # 91; 256 # 93;

enum PLAYER_DATABASE
SteamID # 91; 32 # 93;
NAME # 91; 32 # 93;
frag,
dECESE,

noi date g_Player # 91; MAX_PLAYERS + 1 # 93; # 91; PLAYER_DATABASE # 93;
nou bool. g_PlayerConnected # 91; MAX_PLAYERS + 1 # 93;

public plugin_init ()
register_plugin (PLUGIN.VERSION.AUTHOR)

// Obțineți calea către directorul de date al AMXX
get_datadir (g_FileName.charsmax (g_FileName))
// Formați calea către fișierul stats.dat
Formatul (g_FileName. charsmax (g_FileName), "% s / stats.dat". g_FileName)

// După o secundă, executați Read_Stats
set_task (1.0. "Read_Stats")

// Pentru 2 secunde înainte de sfârșitul cardului de timp executați Write_Stats
set_task (2.0 "Write_Stats", 0. "" 0. "d")
>

stocul get_datadir (s_Name # 91; # 93 ;, i_Len)
returnați get_localinfo ("amxx_datadir". s_Name .i_Len)
>

public client_connect (id)
g_PlayerConnected # 91; id # 93; = adevărat
>

public client_disconnect (id)
g_PlayerConnected # 91; id # 93; = false
>

publice Write_Stats ()
noul i_File. i_Frags. i_Deaths

// Deschideți fișierul
i_File = fopen (g_FileName. "a +")

// Dacă fișierul există
dacă (i_File)
pentru (nou i = 1; i <= MAX_PLAYERS ; i ++)
dacă (g_PlayerConnected # 91; eu # 93;)
i_Frags = get_user_frags (i)
i_Deaths = get_user_deaths (i)
get_user_authid (i. g_PlayerData # 91; eu # 93; # 91; SteamID # 93;, charsmax (g_PlayerData))
get_user_name (i. g_PlayerData # 91; eu # 93; # 91; NAME # 93; 31)
num_to_str (i_Frags .g_PlayerData # 91; eu # 93; # 91; frag # 93;, charsmax (g_PlayerData))
num_to_str (i_Deaths .g_PlayerData # 91; eu # 93; # 91; DECESE # 93;, charsmax (g_PlayerData))

// Scrieți
fwrite_raw (i_File. g_PlayerData # 91; eu # 93; # 91; PLAYER_DATABASE. 0 # 93; dimensiunea (g_PlayerData # 91; # 93;), BLOCK_INT)
>
>
/ *
g_PlayerData # 91; id # 93; - datele de jucător c id = i
# 91; PLAYER_DATABASE: 0 # 93; - începerea datelor
Pentru a scrie numai ID Steam, trebuie să utilizați: g_PlayerData # 91; id # 93; # 91; PLAYER_DATABASE: STEAMID # 93;
sizeof (g_PlayerData # 91; # 93;) - lungimea datelor de scris
* /

// Închideți fișierul
fclose (i_File)
>

public Read_Stats ()
data s_Player nouă # 91; PLAYER_DATABASE # 93; i_File

// Deschideți fișierul
i_File = fopen (g_FileName. "a +")

// Dacă fișierul există
dacă (i_File)
în timp ce (fread_raw (i_File. s_PlayerData # 91; PLAYER_DATABASE. 0 # 93; dimensiunea (g_PlayerData # 91; # 93;), BLOCK_INT))
server_print ("==============================")
server_print ("ID STEAM:% s". s_PlayerData # 91; SteamID # 93;)
server_print ("NAME:% s". s_PlayerData # 91; NAME # 93;)
server_print ("FRAGS:% s". s_PlayerData # 91; frag # 93;)
server_print ("DEATHS:% s". s_PlayerData # 91; DECESE # 93;)
server_print ("==============================")
>


// Șterge stats.dat
dacă (file_exists (g_FileName))
delete_file (g_FileName)

Nu-mi scrie în droguri. dacă aveți nevoie de ajutor în mod gratuit. Orice întrebări pe forum.

Cum se creează un fișier .dat


Pentru dvs. va fi o variantă a utilizării funcției write_file (fișierul este creat automat).

și dacă este posibil să se scrie bool la adevărat și fals


În fișierul write_file, al doilea argument (textul pentru scriere) este de tip "string", prin urmare trebuie să scrieți date cu un tip de șir. Puteți scrie un șir "adevărat" sau "fals".

Nu-mi scrie în droguri. dacă aveți nevoie de ajutor în mod gratuit. Orice întrebări pe forum.

Cum se implementează algoritmul acestui plugin (?):
Întregul plugin: lucrul cu un fișier text, care este o statistică în acest format:


Ie scrie la dosar va fi aceasta: să ia un jucător un pseudonim, face un ciclu de căutare în fișierul de nick jucător, dacă porecla nu a fost încă scris la dosar, apoi a scrie un nou șir de caractere pentru această formă o linie în această formă:


Dacă porecla a fost găsită în fișier, atunci trebuie să adăugați +1 la numărul care merge după porecla și ";" simbol. Cum de a face totul? Cel puțin ce comenzi, cicluri de folosit?

Va fi "dur" dacă cel puțin 500-1000 porecle sunt deja. Adică acele cicluri constante pe un dosar. Mi se pare mai bine să stocați datele în memorie și să le salvați într-un fișier numai în anumite cazuri. Încă puteți salva indicii la numărul de linie din statistici cu etica, dacă, desigur, nu se schimbă. Adică, găsiți odată Vasya, amintiți-vă unde și când scrie pentru a face această linie atunci când accesați fișierul. Când creați un pseudonim nou, rețineți și numărul acestuia. Totul este bine, bineînțeles, dacă porecla este aceeași pentru jucător și dacă îl poți schimba, poate schimba de 100 de ori. Și, în general, pentru stocarea datelor există nvault, sql, etc.

Nu-mi scrie în droguri. dacă aveți nevoie de ajutor în mod gratuit. Orice întrebări pe forum.

Prompt vă rog!
Există un document text example.txt. Este scris și va fi scris următoarea linie a formularului:

Jucător arg1 | IP [arg2] | PID | | C_Build: arg4 | Cl Număr OS: arg5

unde arg1 - arg4 sunt variabile care sunt colectate și scrise de plugin.

Întrebare: cum să verificați pentru un meci Arg3 (verificare a treia variabilă, pentru că este unic pentru toate), care ar fi una și aceeași linie în fișierul nu este înregistrat. O înregistrare în acest dosar se efectuează în funcție de linia client_putinserver (id), cred că este clar că, dacă nu bifați o coincidență, cât de mult timp vei merge la server și ori de câte ori va propisyvatsya linie.

X-factor. cumva probabil:
[pion] # include

#define PLUGIN "Plugin"
#define VERSION "1.0"
#define AUTOR "Autor"

#define FILE "example.txt"

public plugin_init ()
register_plugin (PLUGIN.VERSION.AUTHOR)

public client_connect (id)
noua linie # 91; 32 # 93; AuthID # 91; 34 # 93; i_LineCount. nul

// Obțineți parametrul personalizat arg3. De exemplu, acesta va fi AuthID.
get_user_authid (id.authID.charsmax (AuthID))

în timp ce (read_file (FILE.i_LineCount ++, Line.charsmax (Linie), null))
dacă (conține (Linie AuthID)! = - 1)
returnați PLUGIN_HANDLED
>

// Aici este codul dvs. scris în fișierul "Player arg1 | IP # 91; arg2 # 93; | | PID | | C_Build: arg4 | Cl Număr OS: arg5 "
returnați PLUGIN_HANDLED
> [/ pion]

#define PLUGIN "Plugin"
#define VERSION "1.0"
#define AUTOR "Autor"

#define DIR "example_dir"

public plugin_init ()
register_plugin (PLUGIN.VERSION.AUTHOR)

public client_connect (id)
noul AuthID # 91; 34 # 93; File_Argv # 91; 64 # 93;

// Obțineți parametrul personalizat arg3. De exemplu, acesta va fi AuthID.
get_user_authid (id.authID.charsmax (AuthID))

// Dacă există caractere care sunt nevalabile pentru crearea fișierului (cum ar fi un colon etc.), atunci ca opțiune, înlocuiți-le cu orice.
replace_all (AuthID, charsmax (AuthID), ":". "_")

// Numele fișierului va fi parametrul dvs. individual.
formatex (File_Argv.charsmax (File_Argv), "% s /% s" .DIR AuthID)

// Verificați un fișier.
dacă (! file_exists (File_Argv))
// Dacă nu, creați acest fișier.
write_file (File_Argv. "")

// Aici este codul dvs. de scriere în fișierul example.txt al liniei cu informațiile.
>
> [/ pion]

Amintiți-vă, întotdeauna în viață veți fi pictate cu politețe și calm, mai degrabă decât atacuri și show-off-uri ieftine