//+------------------------------------------------------------------------------------------------------------------+
//| ZI_File_Functions_Full_Intenger_Data_Lib 0-81024.mq4|
//| Copyright © Zhunko |
//| ZHUNKO vadim@zhunko.ru |
//|24.10.2008 Ilnur X-79@yandex.ru |
//+------------------------------------------------------------------------------------------------------------------+
//| Îïåðàöèè äëÿ áèíàðíîãî ôàéëà öåëî÷èñëåííûõ äàííûõ. |
//+------------------------------------------------------------------------------------------------------------------+
//| 1. Ôóíêöèÿ "Îïåðàöèè äëÿ áèíàðíîãî ôàéëà öåëî÷èñëåííûõ äàííûõ". |
//| 2. Ôóíêöèÿ "Îïåðàöèè äëÿ áèíàðíîãî ôàéëà ìàññèâà öåëî÷èñëåííûõ äàííûõ". |
//| 3. Ôóíêöèÿ çàïèñûâàåò öåëîå ÷èñëî â äâîè÷íûé ôàéë. |
//| 4. Ôóíêöèÿ ÷èòàåò öåëîå ÷èñëî èç òåêóùåé ïîçèöèè áèíàðíîãî ôàéëà. |
//| 5. Ôóíêöèÿ âîçâðàùàåò ñòðîêîâîå îïèñàíèå êîäà ñèñòåìíîé îøèáêè. |
//+------------------------------------------------------------------------------------------------------------------+
#property copyright "Copyright © 2008 Zhunko, Ilnur"
#property link "vadim@zhunko.ru ; X-79@yandex.ru"
#property library
// Èìïîðòèðóåìûå ôóíêöèè.
#import "kernel32.dll"
bool ReadFile (int hFile, int& lpBuffer[], int nNumberOfBytesToRead, int& lpNumberOfBytesRead[], int lpOverlapped);
bool WriteFile (int hFile, int lpBuffer[], int nNumberOfBytesToWrite, int& lpNumberOfBytesWritten[], int lpOverlapped);
void RtlMoveMemory (int& Destination[], int Source[], int Length);
#import "ntdll.dll"
int RtlGetLastWin32Error();
int RtlSetLastWin32Error (int dwErrCode);
#import
#include <WinKernel32.mqh> // Çàãîëîâî÷íûé ôàéë áèáëèîòåêè "kernel32.dll" ôóíêöèé API Windows XP.
//=================================================================================================================================================================================
// 1. Ôóíêöèÿ "Îïåðàöèè äëÿ áèíàðíîãî ôàéëà öåëî÷èñëåííûõ äàííûõ".=================================================================================================================
//  ðåæèìå ñîçäàíèÿ è çàïèñè âîçâpàùàåò ÷èñëî çàïèñàííûõ èëè ïðî÷èòàííûõ áàéò.  ñëó÷àå íåóñïåøíîãî çàâåpøåíèÿ ôóíêöèÿ âîçâðàùàåò "-1".
//  ðåæèìå ÷òåíèÿ âîçâðàùàåò ïðî÷èòàííîå çíà÷åíèå.
int FileOperationsIntValue (string PathName, // Íàçâàíèå ôàéëà.
int& Value, // Ïåðåìåííàÿ äëÿ çàïèñè èëè ÷òåíèÿ.
int Size, // Ôëàã ôîðìàòà: CHAR_VALUE (1 áàéò);
// SHORT_VALUE (2 áàéòà);
// LONG_VALUE (4 áàéòà).
int ModeCWR, // Òèï ïðîèçâîäèìûõ äåéñòâèé ñ ôàéëîì: 0 - FILE_CREATE_ ñîçäàòü èëè ïåðåïèñàòü ôàéë;
// 1 - FILE_WRITE_ äîïèñàòü ôàéë;
// 2 - FILE_READ_ ÷èòàòü ôàéë.
int Offset, // Ñìåùåíèå â áàéòàõ ôàéëîâîãî óêàçàòåëÿ.
int Origin, // Íà÷àëüíîå ïîëîæåíèå ôàéëîâîãî óêàçàòåëÿ: SEEK_CUR - îò òåêóùåãî ïîëîæåíèÿ,
// SEEK_SET - îò íà÷àëà,
// SEEK_END - îò êîíöà ôàéëà).
int& ArOutputByte[]) // ×èñëî çàïèñàííûõ èëè ïðî÷èòàííûõ áàéò.
{
int Error; // Íîìåð ïîñëåäíåé îøèáêè.
int Handle; // Ñèñòåìíûé äåñêðèïòîð ôàéëà.
int i;
//----
int ArBuffer[1] = {0}; // Áóôåð äëÿ çàïèñè èëè ÷òåíèÿ.
//----
ArrayResize (ArOutputByte, 1);
//----
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
switch (ModeCWR)
{
case 0: Handle = CreateFileA (PathName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); break; // Ñîçäà¸ì ôàéë.
case 1: Handle = CreateFileA (PathName, GENERIC_WRITE|GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); break; // Äîïèñûâàåì ôàéë.
case 2: Handle = CreateFileA (PathName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); break; // ×èòàåì ôàéë.
default: Print ("Îøèáêà â ôóíêöèè \"FileOperationsIntValue()\". Òèï ïðîèçâîäèìûõ äåéñòâèé ñ ôàéëîì ñ ïóò¸ì \"", PathName, "\" âûáðàí íå âåðíî. ModeCWR = ", ModeCWR); return (-1);
}
if (Handle == -1) // Åñëè ôàéë íå îòêðûò.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsIntValue()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå îòêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (-1);
}
if (SetFilePointer (Handle, Offset, NULL, Origin) == -1) // Åñëè ôàéë îòêðûò, ñäâèãàåì ôàéëîâûé óêàçàòåëü, êóäà òðåáóåòñÿ.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsIntValue()\". Ôàéëîâûé óêàçàòåëü ôàéëà ñ ïóò¸ì \"", PathName, "\" íå ñìåù¸í. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
if (CloseHandle (Handle) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsIntValue()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
return (-1);
}
switch (ModeCWR)
{
case 0: // Çàïèñûâàåì èëè äîïèñûâàåì â ôàéë âõîäíîå çíà÷åíèå.
case 1: // Çàïèñûâàåì èëè äîïèñûâàåì â ôàéë âõîäíîå çíà÷åíèå.
{
ArBuffer[0] = Value;
if (WriteFile (Handle, ArBuffer, Size, ArOutputByte, NULL) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsIntValue()\". Çíà÷åíèå â ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàïèñàíî. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
break;
}
case 2: // ×èòàåì èç ôàéëà çíà÷åíèå.
{
if (ReadFile (Handle, ArBuffer, Size, ArOutputByte, NULL) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsIntValue()\". Çíà÷åíèå â ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàïèñàíî. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
else Value = ArBuffer[0];
break;
}
}
if (CloseHandle (Handle) == false) // Çàêðûâàåì ôàéë.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsIntValue()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (-1);
}
switch (ModeCWR)
{
case 0: return (ArOutputByte[0]); // Âîçâðàùàåì êîëè÷åñòâî çàïèñàííûõ áàéò.
case 1: return (ArOutputByte[0]); // Âîçâðàùàåì êîëè÷åñòâî çàïèñàííûõ áàéò.
case 2: return (ArBuffer[0]); // Âîçâðàùàåì ïðî÷èòàííîå çíà÷åíèå.
}
}
//=================================================================================================================================================================================
// 2. Ôóíêöèÿ "Îïåðàöèè äëÿ áèíàðíîãî ôàéëà ìàññèâà öåëî÷èñëåííûõ äàííûõ".=========================================================================================================
// Âîçâpàùàåò ÷èñëî çàïèñàííûõ èëè ïðî÷èòàííûõ ýëåìåíòîâ.  ñëó÷àå íåóñïåøíîãî çàâåpøåíèÿ ôóíêöèÿ âîçâðàùàåò "-1".
int FileOperationsIntArray (string PathName, // Íàçâàíèå ôàéëà.
int& Array[], // Ìàññèâ äëÿ çàïèñè èëè ÷òåíèÿ.
int ModeCWR, // Òèï ïðîèçâîäèìûõ äåéñòâèé ñ ôàéëîì: 0 - FILE_CREATE_ ñîçäàòü èëè ïåðåïèñàòü ôàéë;
// 1 - FILE_WRITE_ äîïèñàòü ôàéë;
// 2 - FILE_READ_ ÷èòàòü ôàéë.
int Start, // Ñòàðòîâàÿ ïîçèöèÿ äëÿ çàïèñè â ìàññèâ èëè ÷òåíèÿ èç ìàññèâà.
int Count, // Êîëè÷åñòâî ýëåìåíòîâ äëÿ çàïèñè èëè ÷òåíèÿ ñ ó÷¸òîì âñåõ èçìåðåíèé.
int Offset, // Ñìåùåíèå â áàéòàõ ôàéëîâîãî óêàçàòåëÿ.
int Origin) // Íà÷àëüíîå ïîëîæåíèå ôàéëîâîãî óêàçàòåëÿ: SEEK_CUR - îò òåêóùåãî ïîëîæåíèÿ,
// SEEK_SET - îò íà÷àëà,
// SEEK_END - îò êîíöà ôàéëà).
{
int Bytes = 4 * Count; // Êîëè÷åñòâî çàïèñûâàåìûõ áàéò.
int Error; // Íîìåð ïîñëåäíåé îøèáêè.
int Handle; // Ñèñòåìíûé äåñêðèïòîð ôàéëà.
int i;
int Size; // Ðàçìåð ìàññèâà.
//----
int ArOutputByte[1]; // Áóôåð äëÿ âîçâðàòà ÷èñëà çàïèñàííûõ èëè ïðî÷èòàííûõ áàéò.
int ArTemp1[]; // Òåõíè÷åñêèé ìàññèâ.
int ArTemp2[]; // Òåõíè÷åñêèé ìàññèâ.
//----
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
switch (ModeCWR)
{
case 0: Handle = CreateFileA (PathName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); break; // Ñîçäà¸ì ôàéë.
case 1: Handle = CreateFileA (PathName, GENERIC_WRITE|GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); break; // Äîïèñûâàåì ôàéë.
case 2: Handle = CreateFileA (PathName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); break; // ×èòàåì ôàéë.
default: Print ("Îøèáêà â ôóíêöèè \"FileOperationsIntArray()\". Òèï ïðîèçâîäèìûõ äåéñòâèé ñ ôàéëîì ñ ïóò¸ì \"", PathName, "\" âûáðàí íå âåðíî. ModeCWR = ", ModeCWR); return (-1);
}
if (Handle == -1) // Åñëè ôàéë íå îòêðûò.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsIntArray()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå îòêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (-1);
}
if (SetFilePointer (Handle, Offset, NULL, Origin) == -1) // Åñëè ôàéë îòêðûò, ñäâèãàåì ôàéëîâûé óêàçàòåëü, êóäà òðåáóåòñÿ.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsIntArray()\". Ôàéëîâûé óêàçàòåëü ôàéëà ñ ïóò¸ì \"", PathName, "\" íå ñìåù¸í. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
if (CloseHandle (Handle) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsIntArray()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
return (-1);
}
switch (ModeCWR)
{
case 0: // Çàïèñûâàåì èëè äîïèñûâàåì â ôàéë âõîäíîé ìàññèâ.
case 1: // Çàïèñûâàåì èëè äîïèñûâàåì â ôàéë âõîäíîé ìàññèâ.
{
Size = ArraySize (Array); // Ðàçìåð âõîäíîãî ìàññèâà.
ArrayResize (ArTemp1, Size); // Èçìåíÿåì ðàçìåð òåõíè÷åñêîãî ìàññèâà ïîä ðàçìåð âõîäíîãî ìàññèâà.
RtlMoveMemory (ArTemp1, Array, Size); // Êîïèðóåì âõîäíîé ìíîãîìåðíûé ìàññèâ â îäíîìåðíûé òåõíè÷åñêèé ìàññèâ.
if (Start != 0) ArrayCopy (ArTemp1, ArTemp1, 0, Start, Count); // Ïåðåãîíÿåì çàïèñûâàåìûå ýëåìåíòû â íà÷àëî ìàññèâà.
if (WriteFile (Handle, ArTemp1, Bytes, ArOutputByte, NULL) == false) // Çàïèñûâàåì â ôàéë óêàçàííîå êîëè÷åñòâî ýëåìåíòîâ.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsIntArray()\". Çíà÷åíèå â ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàïèñàíî. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
break;
}
case 2: // ×èòàåì èç ôàéëà çíà÷åíèå.
{
ArrayResize (ArTemp1, Count); // Èçìåíÿåì ðàçìåð òåõíè÷åñêîãî ìàññèâà ïîä êîëè÷åñòâî ÷èòàåìûõ ýëåìåíòîâ.
if (ReadFile (Handle, ArTemp1, Bytes, ArOutputByte, NULL) == false) // ×èòàåì â ìàññèâ óêàçàííîå êîëè÷åñòâî ýëåìåíòîâ èç ôàéëà.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsIntArray()\". Çíà÷åíèå â ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàïèñàíî. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
Size = ArraySize (Array); // Ðàçìåð âõîäíîãî ìàññèâà.
if (Size < (Start + Count)) Count = Size - Start; // Îïðåäåëÿåì êîëè÷åñòâî êîïèðóåìûõ ýëåìåíòîâ â ñëó÷àå íåäîñòàòî÷íîñòè ðàçìåðà ìàññèâà ïðè¸ìíèêà.
if (Start == 0) RtlMoveMemory (Array, ArTemp1, Size); // Åñëè ñòàðòîâàÿ ïîçèöèÿ ðàâíà íóëþ, òî êîïèðóåì îäíîìåðíûé òåõíè÷åñêèé ìàññèâ â âûõîäíîé ìíîãîìåðíûé ìàññèâ ñðàçó.
else // Åñëè ñòàðòîâàÿ ïîçèöèÿ íå ðàâíà íóëþ.
{
ArrayResize (ArTemp2, Size); // Èçìåíÿåì ðàçìåð âòîðîãî òåõíè÷åñêîãî ìàññèâà ïîä ðàçìåð âõîäíîãî ìàññèâà.
RtlMoveMemory (ArTemp2, Array, Size); // Êîïèðóåì âõîäíîé ìíîãîìåðíûé ìàññèâ â îäíîìåðíûé âòîðîé òåõíè÷åñêèé ìàññèâ. Ñîçäà¸ì îáðàç âõîäíîãî ìàññèâà.
ArrayCopy (ArTemp2, ArTemp1, Start, 0, Count); // Ïåðåãîíÿåì ÷èòàåìûå ýëåìåíòû â óêàçàííîå ìåñòî âòîðîãî òåõíè÷åñêîãî ìàññèâà (îáðàçà âûõîäíîãî ìàññèâà).
RtlMoveMemory (Array, ArTemp2, Size); // Êîïèðóåì îäíîìåðíûé âòîðîé òåõíè÷åñêèé ìàññèâ â âûõîäíîé ìíîãîìåðíûé ìàññèâ.
ArrayResize (ArTemp2, 0); // Óíè÷òîæàåì âòîðîé òåõíè÷åñêèé ìàññèâ.
}
break;
}
}
if (CloseHandle (Handle) == false) // Çàêðûâàåì ôàéë.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsIntArray()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (-1);
}
ArrayResize (ArTemp1, 0); // Óíè÷òîæàåì ìàññèâ.
return (ArOutputByte[0] / 4);
}
//=================================================================================================================================================================================
// 3. Ôóíêöèÿ çàïèñûâàåò öåëîå ÷èñëî â äâîè÷íûé ôàéë.==============================================================================================================================
// Âîçâðàùàåò ôàêòè÷åñêè çàïèñàííîå ÷èñëî áàéò èëè îòðèöàòåëüíîå çíà÷åíèå â ñëó÷àå îøèáêè.
int FileWriteIntegerFull (int Handle, // Ôàéëîâûé îïèñàòåëü, âîçâðàùàåìûé ôóíêöèåé "FileOpenFull()".
int Value, // Çíà÷åíèå äâîéíîé òî÷íîñòè.
int Size) // Ôëàã ôîðìàòà: CHAR_VALUE (1 áàéò);
// SHORT_VALUE (2 áàéòà);
// LONG_VALUE (4 áàéòà).
{
int Error; // Íîìåð ïîñëåäíåé îøèáêè.
//----
int ArBuffer[1] = {0}; // Áóôåð äëÿ çàïèñè èëè ÷òåíèÿ.
int ArOutputByte[1]; // ×èñëî çàïèñàííûõ èëè ïðî÷èòàííûõ áàéò.
//----
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
ArBuffer[0] = Value;
if (WriteFile (Handle, ArBuffer, Size, ArOutputByte, NULL) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileWriteIntegerFull()\". Çíà÷åíèå â ôàéë íå çàïèñàíî. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (-1);
}
else return (ArOutputByte[0]);
}
//=================================================================================================================================================================================
// 4. Ôóíêöèÿ ÷èòàåò öåëîå ÷èñëî èç òåêóùåé ïîçèöèè áèíàðíîãî ôàéëà.===============================================================================================================
int FileReadIntegerFull (int Handle, // Ôàéëîâûé îïèñàòåëü, âîçâðàùàåìûé ôóíêöèåé "FileOpenFull()".
int Size) // Ôëàã ôîðìàòà: CHAR_VALUE (1 áàéò);
// SHORT_VALUE (2 áàéòà);
// LONG_VALUE (4 áàéòà).
{
int Error; // Íîìåð ïîñëåäíåé îøèáêè.
//----
int ArBuffer[1] = {0}; // Áóôåð äëÿ çàïèñè èëè ÷òåíèÿ.
int ArOutputByte[1]; // ×èñëî çàïèñàííûõ èëè ïðî÷èòàííûõ áàéò.
//----
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
if (ReadFile (Handle, ArBuffer, Size, ArOutputByte, NULL) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileReadIntegerFull()\". Çíà÷åíèå èç ôàéëà íå ïðî÷èòàíî. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (0);
}
else return (ArBuffer[0]);
}
//=================================================================================================================================================================================
// 5. Ôóíêöèÿ âîçâðàùàåò ñòðîêîâîå îïèñàíèå êîäà ñèñòåìíîé îøèáêè.=================================================================================================================
string StringError (int ErrorCode)
{
int i;
string String = "";
//----
int Buffer[128];
//----
ArrayInitialize (Buffer, 0);
FormatMessageA (0x1000, 0, ErrorCode, 0, Buffer, ArraySize (Buffer), 0);
//----
for (i = 0; i < ArraySize (Buffer); i++)
{
String = String + CharToStr (Buffer[i] & 0xFF)
+ CharToStr (Buffer[i] >> 8 & 0xFF)
+ CharToStr (Buffer[i] >> 16 & 0xFF)
+ CharToStr (Buffer[i] >> 24 & 0xFF);
}
return (StringTrimRight (String) + ".");
}
//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ
Comments