Робота з файлами і директоріями - російська спільнота по скриптингу amxx

Робота з директоріями
Код: Виділити все read_dir (const dirname # 91; # 93 ;, pos. output # 91; # 93 ;, len. outlen)
Ця функція призначена для читання вмісту директорії. Функція повертає індекс наступного елемента в папці або 0, якщо досягнуто кінець директорії і файлів більше немає.
Примітка: Ця функція неефективна і замість неї рекомендується використовувати open_dir.
Код: Виділити все dir_exists (const dir # 91; # 93;)
Ця функція призначена для перевірки, чи існує зазначена директорія. Повертає 1, якщо директорія існує або 0 в іншому випадку.
Код: Виділити все rmdir (const path # 91; # 93;)
Дана функия призначена для видалення директорії. Якщо в директорії містяться файли, то її видалити не можна.
Код: Виділити все mkdir (const dirname # 91; # 93;)
Ця функція призначена для створення директорії. Вона повертає 0 при успішному виконанні.
Код: Виділити все open_dir (dir # 91; # 93 ;, firstfile # 91; # 93 ;, length)
Ця функція призначена для відкриття директорії для читання. Повертає покажчик на директорію або 0 в іншому випадку. Вказуючи директорію в параметрі dir. вважається, що ви перебуваєте в директорії мода (наприклад, cstrike). Але можна вийти з директорії і на рівні вище (використовуючи. /), Наприклад:
Код: Виділити все
new i_Dir. s_File # 91; 128 # 93;
i_Dir = open_dir ( "../". s_File. charsmax (s_File))

Ми вже опинимося в головній директорії сервера, там де знаходиться hlds.exe. Але існує ліміт, ви не зможете вийти далі логічного розділу, де знаходиться сервера, на вашому жеском диску.
Код: Виділити все next_file (dirh. Buffer # 91; # 93 ;, length)
Ця функція читає наступний файл за вказаною вказівником на директорію. Повертає 1 при успішному виконанні або 0 в іншому випадку.
Код: Виділити все close_dir (dirh)
Закриває директорію за вказаною вказівником. Ви повинні використовувати функцію на вірному покажчику, отриманому в open_dir.

Наприклад, напишемо плагін, який буде зчитувати всі карти з директорії. / Cstrike / maps і виводити їх в консоль сервера:
Код: Виділити все #include

#define PLUGIN "Read Maps"
#define VERSION "1.0"
#define AUTHOR "DJ_WEST"

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

new i_Dir. s_File # 91; 128 # 93;

// Зберігаємо покажчик на директорію cstrike / maps в i_Dir
i_Dir = open_dir ( "maps". s_File. charsmax (s_File))

// Перевіряємо чи існує директорія
if (i_Dir)
server_print ( "*** MAPS ***")

// Поки next_file повертає значення! = 0 виводимо карту в консоль
while (next_file (i_Dir. s_File. charsmax (s_File)))
// Перевіряємо якщо перший символ файлу дорівнює '.', Щось не виводимо
// Функція зчитує '.' і '..', які не є файлами,
// а просто говорять про те, що є рівень каталогу вище
if (s_File # 91; 0 # 93; == '.' )
continue

// Перевіряємо, щоб файл містив .bsp, що говорить нам про те, що це карта
// Тому що в директорії можуть бути і інші файли або директорії
if (containi (s_File. ".bsp")! = - 1)
server_print (s_File)
>
>
>

Робота з файлами (старий спосіб)
Код: Виділити все file_exists (const file # 91; # 93;)
Ця функція призначена для перевірки, чи існує вказаний файл. Повертає 1, якщо існує або 0 в іншому випадку.
Код: Виділити все delete_file (const file # 91; # 93;)
Ця функція призначена для видалення зазначеного файлу. Повертає 1 при успішному виконанні або 0 в іншому випадку.
Код: Виділити все read_file (const file # 91; # 93 ;, line. text # 91; # 93 ;, len. txtlen)
Ця функція призначена для читання рядка в файлі. Повертає індекс до наступного рядка або 0, якщо досягнуто кінець файлу. Рядки в файлах починаються з 0 номера. Зазначена рядок (параметр line), зчитується в text із зазначеним довжиною len. Кількість прочитаних символів зберігається в txtLen.
Код: Виділити все write_file (const file # 91; # 93 ;, const text # 91; # 93 ;, line = - 1)
Ця функція призначена для запис рядка в файл за вказаним місцем. Повертає 0 при неуспішному виконанні. Якщо line вказати -1, то запис рядка відбудеться в кінець файлу. Функція автоматично створює файл, якщо він не існує.
Код: Виділити все rename_file (const oldname # 91; # 93 ;, const newname # 91; # 93 ;, relative = 0)
Ця функція призначена для перейменування файлу. Повертає 1 при успішному виконанні або 0 в іншому випадку. Якщо relative НЕ 0, то буде вважатися, що поточна директорія - це директорія мода. В іншому випадку, поточна директорія не визначена (але є каталогом HLDS сервера).
Код: Виділити все file_size (const file # 91; # 93 ;, flag = 0)
Ця функція повертає розмір файлу. Якщо flag:
0 - розмір файлу в байтах
1 - кількість рядків у файлі
2 - повертає 1, якщо файл закінчується перекладом рядка
Якщо файл не існує, повертає -1.
Код: Виділити все filesize (const filename # 91; # 93 ;, any. )
Ця функція повертає розмір файлу. filename можна формувати по стилю format, тобто вказувати змінні в any.


Записати в файл дані з масііва stream розміром blocksize в режимі mode.
Можливі режими mode:
BLOCK_INT - для запису будь-якого числа або символів
BLOCK_SHORT - для запису символів і значень у межах -32767 -> 32767
BLOCK_CHAR - для запису символів і значень у межах -127 -> 127
BLOCK_BYTE - схоже на BLOCK_CHAR
Повертає число успішно записаних блоків.
Код: Виділити все fprintf (file. Const fmt # 91; # 93 ;, any. )
Ця функція призначена для запису формований рядки в файл.
Код: Виділити все fseek (file. Position. Start)
Ця функція призначена для установки поточної позиції курсора в файлі. position - це зміщення від start. start може бути:
SEEK_SET - початок файлу
SEEK_CUR - поточна позиція курсору
SEEK_END - кінець файлу
Код: Виділити все ftell (file)
Ця функція призначена для повернення поточної позиції курсора в файлі.
Код: Виділити все fgets (file. Buffer # 91; # 93 ;, maxlength)
Ця функція призначена для читання рядка з файлу. Зчитує також символи перенесення каретки і нового рядка.
Код: Виділити все fgetc (file)
Ця функція призначена для читання одного символу (1 байта) з файлу за вказаною вказівником на нього.
Код: Виділити все fgetf (file)
Ця функція призначена для читання float значення (4 байта, 8 на AMD64) з файлу за вказаною вказівником на нього. Ця функція видалена в AMXX 1.1.
Код: Виділити все fgeti (file)
Ця функція призначена для читання integer значення (4 байта) з файлу за вказаною вказівником на нього. Ця функція видалена в AMXX 1.1.
Код: Виділити все fgetl (file)
Ця функція призначена для читання long значення (4 байта) з файлу за вказаною вказівником на нього. Ця функція видалена в AMXX 1.1.
Код: Виділити все fputs (file. Const text # 91; # 93;)
Ця функція призначена для запису рядка в файл поточної позиції курсора файлу. Повертає число усппешно записаних символів.
Код: Виділити все fputc (file)
Ця функція призначена для запису одного символу (1 байта) в файл за вказаною вказівником на нього.
Код: Виділити все fputf (file)
Ця функція призначена для запису float значення (4 байта, 8 на AMD64) в файл за вказаною вказівником на нього. Ця функція видалена в AMXX 1.1.
Код: Виділити все fputi (file)
Ця функція призначена для запису integer значення (4 байта) в файл за вказаною вказівником на нього. Ця функція видалена в AMXX 1.1.
Код: Виділити все fputl (file)
Ця функція призначена для запису long значення (4 байта) в файл за вказаною вказівником на нього. Ця функція видалена в AMXX 1.1.
Код: Виділити все fungetc (file. Data)
Ця функція призначена для збереження символу (1 байта) в data.

Наприклад, плагін, який використовує RAW читання і запис, збереження steam id, ника, Фрагів і вбивств гравців, які на сервері в stats.dat, а також читання їх після зміни карти (stats.dat буде зберігати статистику гравців, що грають на сервері в Наразі за одну карту):
Код: Виділити все #include

#define PLUGIN "Player Database"
#define VERSION "1.0"
#define AUTHOR "DJ_WEST schnitzelmaker "

#define MAX_PLAYERS 32

new g_FileName # 91; 256 # 93;

enum PLAYER_DATABASE
STEAMID # 91; 32 # 93 ;,
NAME # 91; 32 # 93 ;,
FRAGS,
DEATHS,

new g_PlayerData # 91; MAX_PLAYERS + 1 # 93; # 91; PLAYER_DATABASE # 93;
new bool. g_PlayerConnected # 91; MAX_PLAYERS + 1 # 93;

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

// Отримуємо шлях до data директорії AMXX
get_datadir (g_FileName. charsmax (g_FileName))
// Формуємо шлях до файлу stats.dat
format (g_FileName. charsmax (g_FileName), "% s / stats.dat". g_FileName)

// Через 1 секунду виконати Read_Stats
set_task (1.0. "Read_Stats")

// За 2 секунди перед закінченням часу карти виконати Write_Stats
set_task (2.0. "Write_Stats". 0. "". 0. "d")
>

stock get_datadir (s_Name # 91; # 93 ;, i_Len)
return get_localinfo ( "amxx_datadir". s_Name. i_Len)
>

public client_connect (id)
g_PlayerConnected # 91; id # 93; = true
>

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

public Write_Stats ()
new i_File. i_Frags. i_Deaths

// Відкрити файл
i_File = fopen (g_FileName. "a +")

// Якщо файл існує
if (i_File)
for (new i = 1; i <= MAX_PLAYERS ; i ++)
if (g_PlayerConnected # 91; i # 93;)
i_Frags = get_user_frags (i)
i_Deaths = get_user_deaths (i)
get_user_authid (i. g_PlayerData # 91; i # 93; # 91; STEAMID # 93 ;, charsmax (g_PlayerData))
get_user_name (i. g_PlayerData # 91; i # 93; # 91; NAME # 93 ;, 31)
num_to_str (i_Frags. g_PlayerData # 91; i # 93; # 91; FRAGS # 93 ;, charsmax (g_PlayerData))
num_to_str (i_Deaths. g_PlayerData # 91; i # 93; # 91; DEATHS # 93 ;, charsmax (g_PlayerData))

// Записуємо
fwrite_raw (i_File. g_PlayerData # 91; i # 93; # 91; PLAYER_DATABASE. 0 # 93 ;, sizeof (g_PlayerData # 91; # 93;), BLOCK_INT)
>
>
/ *
g_PlayerData # 91; id # 93; - даних гравця c id = i
# 91; PLAYER_DATABASE: 0 # 93; - початку даних
Для запису тільки Steam ID необхідно використовувати: g_PlayerData # 91; id # 93; # 91; PLAYER_DATABASE: STEAMID # 93;
sizeof (g_PlayerData # 91; # 93;) - довжина даних, які необхідно записати
* /

// Закрити файл
fclose (i_File)
>

public Read_Stats ()
new s_PlayerData # 91; PLAYER_DATABASE # 93 ;, i_File

// Відкрити файл
i_File = fopen (g_FileName. "a +")

// Якщо файл існує
if (i_File)
while (fread_raw (i_File. s_PlayerData # 91; PLAYER_DATABASE. 0 # 93 ;, sizeof (g_PlayerData # 91; # 93;), BLOCK_INT))
server_print ( "==============================")
server_print ( "STEAM ID:% s". s_PlayerData # 91; STEAMID # 93;)
server_print ( "NAME:% s". s_PlayerData # 91; NAME # 93;)
server_print ( "FRAGS:% s". s_PlayerData # 91; FRAGS # 93;)
server_print ( "DEATHS:% s". s_PlayerData # 91; DEATHS # 93;)
server_print ( "==============================")
>


// Видаляємо stats.dat
if (file_exists (g_FileName))
delete_file (g_FileName)

Не пишіть мені в ЛС. якщо вам потрібна допомога на безоплатній основі. Будь-які питання на форум.

Як створити файл .dat


Для тебе піде варіант використання write_file функції (файл створюється автоматично).

і чи можна записувати в нього bool значення true і false


У write_file другий аргумент (текст для запису) має тип "рядок", отже тобі і треба записувати дані з типом рядок. Ти можеш записати "true" або "false" рядком.

Не пишіть мені в ЛС. якщо вам потрібна допомога на безоплатній основі. Будь-які питання на форум.

Як реалізувати алгоритм такого плагіна (?):
Весь плагін: робота з текстовим файлом, який представляє з себе статистику в такому форматі:


Тобто запис в файл буде така: беремо нік гравця, робимо цикл пошуку в файлі по ніку гравця, якщо нік ще не був записаний в файл, то записуємо новим рядком, для цього формуємо рядок в такому вигляді:


Якщо ж нік був знайдений у файлі, то необхідно додати +1 до числа, яке йде після ника і ";" символу. Як все це зробити? Хоча б якісь команди, цикли використовувати?

Це буде "жорстко", якщо хоча б буде вже 500-1000 ників. Я про те, що постійні цикли по файлу. Краще мені здається зберігати дані в пам'яті, а в файл зберігати тільки в певні випадки. Можна ще зберігати покажчики на номер рядка в статистиці з етмі ніком, якщо, звичайно, він не буде змінюватися. Тобто знайти один раз Васю, запам'ятати, де він і запис робити по цьому рядку при звернення до файлу. При створенні нового ника, також запам'ятати його номер. Це все добре, звичайно, якщо нік буде протягом гри у гравця один і той же, а якщо можна міняти, то він може змінити його по 100 разів. І взагалі для зберігання даних є nvault, sql і т.д.

Не пишіть мені в ЛС. якщо вам потрібна допомога на безоплатній основі. Будь-які питання на форум.

Підкажіть будь ласка!
Є текстовий документ example.txt. У нього записана і буде далі запісиватся рядок виду:

Player arg1 | IP [arg2] | PID | C_Build: arg4 | Cl OS number: arg5

де arg1 - arg4 - змінні, які збираються і записуються плагіном.

Питання: як перевірити на збіг arg3 (перевірка за 3-ою змінної, оскільки вона унікальна для всіх), що б одна і та ж рядок в файл не записувалася. Запис в файл цього рядка здійснюється у функції client_putinserver (id), думаю зрозуміло, що якщо не перевірити збіг, то скільки разів будеш заходити на сервер стільки і буде раз пропісиватся рядок.

X-factor. як-то так напевно:
[Pawn] #include

#define PLUGIN "Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"

#define FILE "example.txt"

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

public client_connect (id)
new Line # 91; 32 # 93 ;, AuthID # 91; 34 # 93 ;, i_LineCount. null

// Отримуємо твій індивідуальний параметр arg3. Для прикладу, це буде AuthID.
get_user_authid (id. AuthID. charsmax (AuthID))

while (read_file (FILE. i_LineCount ++, Line. charsmax (Line), null))
if (contain (Line. AuthID)! = - 1)
return PLUGIN_HANDLED
>

// Тут твій код, який записує в файл рядок "Player arg1 | IP # 91; arg2 # 93; | PID | C_Build: arg4 | Cl OS number: arg5 "
return PLUGIN_HANDLED
> [/ Pawn]

#define PLUGIN "Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"

#define DIR "example_dir"

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

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

// Отримуємо твій індивідуальний параметр arg3. Для прикладу, це буде AuthID.
get_user_authid (id. AuthID. charsmax (AuthID))

// Якщо присутні неприпустимі для створення файлу символи (такі як двокрапка і ін.), То як варіант замінити їх на що-небудь.
replace_all (AuthID. charsmax (AuthID), ":". "_")

// Назва файлу буде представляти із себе твій індивідуальний параметр.
formatex (File_Argv. charsmax (File_Argv), "% s /% s". DIR. AuthID)

// Перевіряємо на наявність файлу.
if (! file_exists (File_Argv))
// При остутствие, створюємо цей файл.
write_file (File_Argv. "")

// Тут твій код записи в файл example.txt рядки з інфою.
>
> [/ Pawn]

Запам'ятайте, завжди по життю вас будуть фарбувати ввічливість і спокій, а не наїзди і дешеві понти