//+------------------------------------------------------------------------------------------------------------------+
//| ZI_File_Functions_Full_String_Value_Lib 0-81024.mq4|
//| Copyright © Zhunko |
//| ZHUNKO vadim@zhunko.ru |
//|24.10.2008 Ilnur X-79@yandex.ru |
//+------------------------------------------------------------------------------------------------------------------+
//| Îïåðàöèè äëÿ áèíàðíîãî ôàéëà ñòðîêîâûõ äàííûõ. |
//+------------------------------------------------------------------------------------------------------------------+
//| 1. Ôóíêöèÿ "Îïåðàöèè äëÿ áèíàðíîãî ôàéëà ñòðîêîâûõ äàííûõ". |
//| 2. Ôóíêöèÿ çàïèñûâàåò öåëîå ÷èñëî â äâîè÷íûé ôàéë. |
//| 3. Ôóíêöèÿ ÷èòàåò öåëîå ÷èñëî èç òåêóùåé ïîçèöèè áèíàðíîãî ôàéëà. |
//| 4. Ôóíêöèÿ âîçâðàùàåò ñòðîêîâîå îïèñàíèå êîäà ñèñòåìíîé îøèáêè. |
//+------------------------------------------------------------------------------------------------------------------+
#property copyright "Copyright © 2008 Zhunko, Ilnur"
#property link "vadim@zhunko.ru ; X-79@yandex.ru"
#property library
// Èìïîðòèðóåìûå ôóíêöèè.
#import "kernel32.dll"
bool ReadFile (int hFile, string& lpBuffer, int nNumberOfBytesToRead, int& lpNumberOfBytesRead[], int lpOverlapped);
bool WriteFile (int hFile, string lpBuffer, int nNumberOfBytesToWrite, int& lpNumberOfBytesWritten[], int lpOverlapped);
#import "ntdll.dll"
int RtlGetLastWin32Error();
int RtlSetLastWin32Error (int dwErrCode);
#import
#include <WinKernel32.mqh> // Çàãîëîâî÷íûé ôàéë áèáëèîòåêè "kernel32.dll" ôóíêöèé API Windows XP.
//=================================================================================================================================================================================
// 1. Ôóíêöèÿ "Îïåðàöèè äëÿ áèíàðíîãî ôàéëà ñòðîêîâûõ äàííûõ".=====================================================================================================================
// Âîçâpàùàåò ÷èñëî çàïèñàííûõ èëè ïðî÷èòàííûõ áàéò.  ñëó÷àå íåóñïåøíîãî çàâåpøåíèÿ ôóíêöèÿ âîçâðàùàåò "-1".
int FileOperationsStringValue (string PathName, // Íàçâàíèå ôàéëà.
string& Value, // Ïåðåìåííàÿ äëÿ çàïèñè èëè ÷òåíèÿ.
int ModeCWR, // Òèï ïðîèçâîäèìûõ äåéñòâèé ñ ôàéëîì: 0 - FILE_CREATE_ ñîçäàòü èëè ïåðåïèñàòü ôàéë;
// 1 - FILE_WRITE_ äîïèñàòü ôàéë;
// 2 - FILE_READ_ ÷èòàòü ôàéë.
int Size, // Äëèíà çàïèñûâàåìîé èëè ÷èòàåìîé ñòðîêè.
int Offset, // Ñìåùåíèå â áàéòàõ ôàéëîâîãî óêàçàòåëÿ.
int Origin) // Íà÷àëüíîå ïîëîæåíèå ôàéëîâîãî óêàçàòåëÿ: SEEK_CUR - îò òåêóùåãî ïîëîæåíèÿ,
// SEEK_SET - îò íà÷àëà,
// SEEK_END - îò êîíöà ôàéëà).
{
int Error; // Íîìåð ïîñëåäíåé îøèáêè.
int Handle; // Ñèñòåìíûé äåñêðèïòîð ôàéëà.
int i;
//----
int 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 ("Îøèáêà â ôóíêöèè \"FileOperationsStringValue()\". Òèï ïðîèçâîäèìûõ äåéñòâèé ñ ôàéëîì ñ ïóò¸ì \"", PathName, "\" âûáðàí íå âåðíî. ModeCWR = ", ModeCWR); return (-1);
}
if (Handle == -1) // Åñëè ôàéë íå îòêðûò.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsStringValue()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå îòêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (-1);
}
if (SetFilePointer (Handle, Offset, NULL, Origin) == -1) // Åñëè ôàéë îòêðûò, ñäâèãàåì ôàéëîâûé óêàçàòåëü, êóäà òðåáóåòñÿ.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsStringValue()\". Ôàéëîâûé óêàçàòåëü ôàéëà ñ ïóò¸ì \"", PathName, "\" íå ñìåù¸í. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
if (CloseHandle (Handle) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsStringValue()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
return (-1);
}
switch (ModeCWR)
{
case 0: // Çàïèñûâàåì èëè äîïèñûâàåì â ôàéë âõîäíîå çíà÷åíèå.
case 1: // Çàïèñûâàåì èëè äîïèñûâàåì â ôàéë âõîäíîå çíà÷åíèå.
{
if (WriteFile (Handle, Value, Size, ArOutputByte, NULL) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsStringValue()\". Çíà÷åíèå â ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàïèñàíî. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
break;
}
case 2: // ×èòàåì èç ôàéëà çíà÷åíèå.
{
Value = ""; // Èíèöèàëèçèðóåì áóôåð.
for (i = 0; i < Size; i++) Value = Value + " "; // Íà âñÿêèé ñëó÷àé îðãàíèçóåì êîëè÷åñòâî çíàêîâ ðàâíûì çàäàííîìó êîëè÷åñòâó çíàêîâ äëÿ ÷òåíèÿ.
if (ReadFile (Handle, Value, Size, ArOutputByte, NULL) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsStringValue()\". Çíà÷åíèå â ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàïèñàíî. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
break;
}
}
if (CloseHandle (Handle) == false) // Çàêðûâàåì ôàéë.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsStringValue()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (-1);
}
return (ArOutputByte[0]);
}
//=================================================================================================================================================================================
// 2. Ôóíêöèÿ çàïèñûâàåò ñòðîêó â äâîè÷íûé ôàéë ñ òåêóùåé ïîçèöèè.=================================================================================================================
// Âîçâðàùàåò ôàêòè÷åñêè çàïèñàííîå ÷èñëî áàéò èëè îòðèöàòåëüíîå çíà÷åíèå â ñëó÷àå îøèáêè.
int FileWriteStringFull (int Handle, // Ôàéëîâûé îïèñàòåëü, âîçâðàùàåìûé ôóíêöèåé "FileOpenFull()".
string Value, // Çàïèñûâàåìàÿ ñòðîêà.
int Size) // Äëèíà çàïèñûâàåìîé ñòðîêè.
{
int Error; // Íîìåð ïîñëåäíåé îøèáêè.
//----
int ArOutputByte[1]; // ×èñëî çàïèñàííûõ èëè ïðî÷èòàííûõ áàéò.
//----
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
if (WriteFile (Handle, Value, Size, ArOutputByte, NULL) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileWriteStringFull()\". Ñòðîêà â ôàéë íå çàïèñàíà. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (-1);
}
else return (ArOutputByte[0]);
}
//=================================================================================================================================================================================
// 3. Ôóíêöèÿ ÷èòàåò ñòðîêó ñ òåêóùåé ïîçèöèè ôàéëà.===============================================================================================================================
string FileReadStringFull (int Handle, // Ôàéëîâûé îïèñàòåëü, âîçâðàùàåìûé ôóíêöèåé "FileOpenFull()".
int Length) // Êîëè÷åñòâî ñèìâîëîâ äëÿ ÷òåíèÿ.
{
int Error; // Íîìåð ïîñëåäíåé îøèáêè.
string String; // ×èòàåìàÿ ñòðîêà.
//----
int ArOutputByte[1]; // ×èñëî çàïèñàííûõ èëè ïðî÷èòàííûõ áàéò.
//----
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
if (ReadFile (Handle, String, Length, ArOutputByte, NULL) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileReadStringFull()\". Ñòðîêà èç ôàéëà íå ïðî÷èòàíà. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return ("ERROR");
}
else return (String);
}
//=================================================================================================================================================================================
// 4. Ôóíêöèÿ âîçâðàùàåò ñòðîêîâîå îïèñàíèå êîäà ñèñòåìíîé îøèáêè.=================================================================================================================
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