Файловые операции

Группа функций для работы с файлами.

Существует три каталога (с подкаталогами), в которых могут располагаться рабочие файлы:

  • /HISTORY/<текущий брокер> — специально для функции FileOpenHistory;
  • /EXPERTS/FILES — общий случай;
  • /TESTER/FILES — специально для тестирования.

Работа с файлами из других каталогов пресекается.

 

FileClose

void FileClose(int handle)

Закрытие файла, ранее открытого функцией FileOpen().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().

Пример:

int handle = FileOpen("имя файла", FILE_CSV|FILE_READ);
if(handle>0)
{
   // работает с файлом ...
   FileClose(handle);
}

 

FileDelete

void FileDelete(string filename)

Удаление указанного файла. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Файлы могут быть удалены только в том случае, если они расположены в папке каталог_терминала\experts\files (каталог_терминала\tester\files в случае тестирования эксперта) или ее подпапках.

Параметры:

filename — Имя файла.

Пример:

// файл my_table.csv будет удален из папки terminal_dir\experts\files
int lastError;
FileDelete("my_table.csv");
lastError=GetLastError();
if(lastError!=ERR_NOERROR)
{
   Print("ошибка (",lastError,") при удалении файла my_table.csv");
   return(0);
}

 

FileFlush

void FileFlush(int handle)

Сброс на диск всех данных, оставшихся в файловом буфере ввода-вывода.
Замечания: функцию FileFlush() необходимо вызывать между операциями чтения из файла и записи в файл.
При закрытии файла данные сбрасываются на диск автоматически, поэтому нет необходимости вызывать функцию FileFlush() перед вызовом функции FileClose().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().

Пример:

int bars_count = Bars;
int handle = FileOpen("mydat.csv",FILE_CSV|FILE_WRITE);

if(handle>0)
{
   FileWrite(handle, "#","OPEN","CLOSE","HIGH","LOW");

   for(int i=0;i<bars_count;i++)
      FileWrite(handle, i+1,Open[i],Close[i],High[i], Low[i]);

   FileFlush(handle);
   ...

   for(int i=0;i<bars_count;i++)
      FileWrite(handle, i+1,Open[i],Close[i],High[i], Low[i]);

   FileClose(handle);
}

 

FileIsEnding

bool FileIsEnding(int handle)

Возвращает TRUE, если файловый указатель находится в конце файла, иначе возвращает FALSE.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). В случае достижения конца файла в процессе чтения функция GetLastError() вернет ошибку ERR_END_OF_FILE (4099).

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().

Пример:

if(FileIsEnding(h1))
{
   FileClose(h1);
   return(false);
}

 

FileIsLineEnding

bool FileIsLineEnding(int handle)

Возвращает TRUE, если файловый указатель находится в конце строки файла формата CSV, иначе возвращает FALSE. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().

Пример:

if(FileIsLineEnding(h1))
{
   FileClose(h1);
   return(false);
}

 

FileOpen

int FileOpen(string filename, int mode, int delimiter=’;’)

Открывает Файл для ввода и/или вывода. Возвращает файловый описатель открытого файла или -1 в случае неудачи. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Замечания: файлы могут открываться только в папке каталог_терминала\experts\files (каталог_терминала\tester\files в случае тестирования эксперта) или ее подпапках.
Нельзя одновременно использовать режимы FILE_BIN и FILE_CSV.
Если FILE_WRITE не комбинируется с FILE_READ, то будет открыт файл нулевой длины. Даже если до открытия в файле были данные, то они будут уничтожены. Если необходимо дописывать данные в существующий файл, то его нужно открывать, используя комбинацию FILE_READ | FILE_WRITE.
Если FILE_READ не комбинируется с FILE_WRITE, то файл будет открыт только в том случае, если он уже существует. Если файл не существует, то создать его можно, используя режим FILE_WRITE.
Одновременно может быть открыто не более 32 файлов в пределах одного исполняемого модуля. Описатели файлов, открытых в одном модуле, нельзя передавать в другие модули (библиотеки).

Параметры:

filename — Имя файла.
mode — Способ открытия. Это может быть одна величина или их комбинация: FILE_BIN, FILE_CSV, FILE_READ, FILE_WRITE.
delimiter — Знак разделителя для csv-файлов. По умолчанию применяется символ ‘;’.

Пример:

int handle;
handle = FileOpen("my_data.csv",FILE_CSV|FILE_READ,';');

if(handle<1)
{
   Print("Файл my_data.dat не обнаружен, последняя ошибка ", GetLastError());
   return(false);
}

 

FileOpenHistory

int FileOpenHistory(string filename, int mode, int delimiter=’;’)

Открывает файл в текущей папке истории (каталог_терминала\history\server_name) или ее подпапках. Возвращает описатель файла или -1 в случае неудачи. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Замечания: клиентский терминал может подключаться к серверам разных брокерских компаний. Исторические данные (файлы HST) каждой брокерской компании хранятся в соответствующей подпапке папки истории каталог_терминала\history.
Функция может быть полезна для формирования собственных исторических данных нестандартного символа и/или периода. Файл, сформированный в папке истории может быть открыт автономно, для его графика не требуется подкачка данных.

Параметры:

filename — Имя файла.
mode — Режим открытия. Это может быть одна величина или их комбинация: FILE_BIN, FILE_CSV, FILE_READ, FILE_WRITE.
delimiter — Знак разделителя для csv-файлов. По умолчанию применяется символ ‘;’.

Пример:

int handle=FileOpenHistory("USDX240.HST",FILE_BIN|FILE_WRITE);

if(handle<1)
{
   Print("Не может создать файл USDX240.HST");
   return(false);
}
// работа с файлом
// ...

FileClose(handle);

 

FileReadArray

int FileReadArray(int handle, void array[], int start, int count)

Функция читает указанное число элементов из двоичного файла в массив. Перед чтением данных массив должен быть достаточного размера. Функция возвращает количество фактически прочитанных элементов.
Для того чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().
array[] — Массив, куда данные будут загружены.
start — Стартовая позиция для записи в массив.
count — Количество элементов для чтения.

Пример:

int handle;
double varray[10];
handle = FileOpen("filename.dat", FILE_BIN|FILE_READ);

if(handle>0)
{
   FileReadArray(handle, varray, 0, 10);
   FileClose(handle);
}

 

FileReadDouble

double FileReadDouble(int handle, int size=DOUBLE_VALUE)

Функция читает число двойной точности с плавающей точкой (double) из текущей позиции бинарного файла. Размер числа может быть 8 байтов (double) или 4 байта (float).
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().
size — Формат числа. Может быть DOUBLE_VALUE (8 байтов) или FLOAT_VALUE (4 байта).

Пример:

int handle;
double value;
handle=FileOpen("mydata.dat",FILE_BIN);

if(handle>0)
{
   value=FileReadDouble(handle,DOUBLE_VALUE);
   FileClose(handle);
}

 

FileReadInteger

int FileReadInteger(int handle, int size=LONG_VALUE)

Функция читает целое число из текущей позиции бинарного файла. Размер целого числа может быть 1, 2 или 4 байта. Если размер числа не указан, система пытается прочитать как 4-байтовое целое число.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().
size — Формата числа. Может быть CHAR_VALUE(1 байт), SHORT_VALUE(2 байта) или LONG_VALUE(4 байта).

Пример:

int handle;
int value;
handle = FileOpen("mydata.dat", FILE_BIN|FILE_READ);

if(handle>0)
{
   value=FileReadInteger(h1,2);
   FileClose(handle);
}

 

FileReadNumber

double FileReadNumber(int handle)

Чтение числа с текущей позиции файла CSV до разделителя. Применяется только для файлов CSV.
Для того чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().

Пример:

int handle;
int value;
handle = FileOpen("filename.csv", FILE_CSV, '\t');

if(handle>0)
{
   value=FileReadNumber(handle);
   FileClose(handle);
}

 

FileReadString

string FileReadString(int handle, int length=0)

Функция читает строку с текущей позиции файла. Применяется как к CSV, так и к двоичным файлам. Для текстовых файлов строка будет прочитана до разделителя. Для бинарных файлов в строку будет прочитано указанное количество символов.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().
length — Количество символов для чтения.

Пример:

int handle;
string str;
handle = FileOpen("filename.csv", FILE_CSV|FILE_READ);

if(handle>0)
{
   str=FileReadString(handle);
   FileClose(handle);
}

 

FileSeek

bool FileSeek(int handle, int offset, int origin)

Функция перемещает файловый указатель на новую позицию, которая является смещением в байтах от начала, конца или текущей позиции файла. Следующее чтение или запись происходят с новой позиции.
Если перемещение файлового указателя прошло успешно, функция возвращает TRUE, иначе возвращает FALSE. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().
offset — Смещение в байтах.
origin — Начальное положение. Величина может быть одной из этих констант:
SEEK_CUR — от текущего положения,
SEEK_SET — от начала,
SEEK_END — от конца файла.

Пример:

int handle=FileOpen("filename.csv", FILE_CSV|FILE_READ|FILE_WRITE, ';');
if(handle>0)
{
   FileSeek(handle, 0, SEEK_END);
   //---- add data to the end of file
   FileWrite(handle, data1, data2);
   FileClose(handle);
   handle=0;
}

 

FileSize

int FileSize(int handle)

Функция возвращает размер файла в байтах.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().

Пример:

int handle;
int size;
handle=FileOpen("my_table.dat", FILE_BIN|FILE_READ);

if(handle>0)
{
   size=FileSize(handle);
   Print("my_table.dat размер ", size, " bytes");
   FileClose(handle);
}

 

FileTell

int FileTell(int handle)

Функция возвращает смещение текущей позицию файлового указателя от начала файла.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().

Пример:

int handle;
int pos;
handle=FileOpen("my_table.dat", FILE_BIN|FILE_READ);

// чтение некоторых данных
pos=FileTell(handle);
Print("current position is ", pos);

 

FileWrite

int FileWrite(int handle, …)

Функция предназначена для записи данных в файл CSV, разделитель между данными включается автоматически. После записи в файл добавляется признак конца строки «\r\n». При выводе числовые данные преобразуются в текстовый формат (см. функцию Print()).
Возвращает количество записанных символов или отрицательное значение, если происходит ошибка .
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().
— Данные, разделенные запятыми. Может быть не больше 63 параметров.

Данные типов double, int автоматически преобразовываются в строку, данные типов color, datetime и bool воспринимаются как целыечисла (тип int), данные типа string выводятся как есть, без преобразования.
В качестве параметра нельзя передать массивы, массивы могут быть выведены поэлементно.

Пример:

int handle;
datetime orderOpen=OrderOpenTime();
handle=FileOpen("filename", FILE_CSV|FILE_WRITE, '\t');

if(handle>0)
{
   FileWrite(handle, Close[0], Open[0], High[0], Low[0], TimeToStr(orderOpen));
   FileClose(handle);
}

 

FileWriteArray

int FileWriteArray(int handle, object array[], int start, int count)

Функция записывает массив в бинарный файл. Массивы типа int, bool, datetime и color записываются поэлементно как 4-байтовые целые числа. Массивы типа double записываются поэлементно как 8-байтовые числа c плавающей запятой. Массивы типа string записываются построчно, после каждой строки автоматически добавляется признак конца строки «\r\n».
Возвращает число записанных элементов или отрицательное значение в случае ошибки.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().
array[] — Массив для записи.
start — Начальный индекс в массиве (номер первого записываемого элемента).
count — Количество записываемых элементов.

Пример:

int handle;
double BarOpenValues[10];

// скопирует первые десять баров в массив
for(int i=0;i<10; i++)
   BarOpenValues[i]=Open[i];

// запись массива в файл
handle=FileOpen("mydata.dat", FILE_BIN|FILE_WRITE);

if(handle>0)
{
   FileWriteArray(handle, BarOpenValues, 3, 7); // запись последних 7 элементов
   FileClose(handle);
}

 

FileWriteDouble

int FileWriteDouble(int handle, double value, int size=DOUBLE_VALUE)

Функция записывает число с плавающей запятой в двоичный файл. Если формат задан FLOAT_VALUE, то значение будет записано как 4-байтовое число с плавающей запятой (тип float), иначе будет записан в 8-байтовом формате с плавающей запятой (тип double).
Возвращает фактически записанное число байт или отрицательное значение в случае ошибки.
Для того чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().
value — Значение двойной точности.
size — Дополнительный флаг формата. Может быть любой из следующих величин:
DOUBLE_VALUE (8 байтов, по умолчанию)
FLOAT_VALUE (4 байта).

Пример:

int handle;
double var1=0.345;

handle = FileOpen("mydata.dat", FILE_BIN|FILE_WRITE);

if(handle<1)
{
   Print("can't open file error-",GetLastError());
   return(0);
}

FileWriteDouble(h1, var1, DOUBLE_VALUE);
//...
FileClose(handle);

 

FileWriteInteger

int FileWriteInteger(int handle, int value, int size=LONG_VALUE)

Функция записывает значение целого числа в двоичный файл. Если размер — SHORT_VALUE, значение будет записано как 2-байтовое целое число (тип short), если размер — CHAR_VALUE, значение будет записано как 1-байтовое целое число (тип char), если размер — LONG_VALUE, значение будет записано как 4-байтовое целое число (тип long int).
Возвращает число фактически записанных байтов или отрицательное значение в случае ошибки.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().
value — Значение для записи.
size — Дополнительный флаг формата. Может быть любой из следующих величин:
CHAR_VALUE (1 байт),
SHORT_VALUE (2 байта),
LONG_VALUE (4 байта, по умолчанию).

Пример:

int handle;
int value=10;

handle = FileOpen("filename.dat", FILE_BIN|FILE_WRITE);

if(handle<1)
{
   Print("can't open file error-",GetLastError());
   return(0);
}

FileWriteInteger(handle, value, SHORT_VALUE);
//...
FileClose(handle);

 

FileWriteString

int FileWriteString(int handle, string value, int size)

Функция записывает строку в двоичный файл с текущей позиции.
Возвращает число фактически записанных байтов или отрицательное значение в случае ошибки.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

handle — Файловый описатель, возвращаемый функцией FileOpen().
value — Записываемая строка.
size — Длина записываемой строки. Если строка длиннее, чем указанное значение, то она будет усечена. Если строка короче, то она будет добавлена двоичными 0 до указанной длины.

Пример:

int handle;
string str="some string";

handle=FileOpen("filename.bin", FILE_BIN|FILE_WRITE);

if(handle<1)
{
   Print("can't open file error-",GetLastError());
   return(0);
}

FileWriteString(handle, str, 8);
FileClose(handle);