1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
unsigned int File::open(const std::wstring &Name, bool Truncate)
{
// Für mehrmaliges Öffnen einer Datei
close ();
// Datei öffnen
if ((m_pFile = CreateFile (Name.c_str(),
GENERIC_ALL,
FILE_SHARE_READ, NULL,
Truncate ? TRUNCATE_EXISTING : OPEN_EXISTING, // Zuerst prüfen ob die Datei besteht
FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
{
if ((m_pFile = CreateFile (Name.c_str(),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ, NULL,
CREATE_NEW, // Falls die Datei nicht existiert muss eine Neue erstellt werden
FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
return 0;
}
set_file_pointer (FILE_BEGIN, 0);
return 1;
}
unsigned int File::set_file_pointer(DWORD Start, int Distance)
{
if (!is_open ()) return 0;
// Parameter prüfen
if ((unsigned int)(abs(Distance)) > get_size() || Start == FILE_BEGIN && Distance < 0)
return 0;
if (Start == FILE_CURRENT && (Distance+get_file_pointer() < 0 || Distance+get_file_pointer() > get_size()))
return 0;
// Dateizeiger setzen
LARGE_INTEGER DistanceToMove;
ZeroMemory (&DistanceToMove, sizeof(DistanceToMove));
DistanceToMove.QuadPart = Distance;
if (!SetFilePointerEx (m_pFile, DistanceToMove, NULL, Start))
return 0;
return 1;
}
unsigned int File::get_size() const
{
if (!is_open())
return 0;
// Dateigröße abfragen
LARGE_INTEGER FileSize;
ZeroMemory (&FileSize, sizeof(FileSize));
GetFileSizeEx (m_pFile, &FileSize);
return static_cast<unsigned int>(FileSize.QuadPart);
}
unsigned int File::read(unsigned int NumBytes, void *pData) const
{
if (!is_open()) return 0;
// Aus der Datei lesen
unsigned int ReceivedBytes;
if (!ReadFile (m_pFile, pData, NumBytes, reinterpret_cast<DWORD*>(&ReceivedBytes), NULL) || ReceivedBytes != NumBytes)
return 0;
return 1;
}
|