Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

30.11.2008, 11:52

[Erledigt] Problem mit WinAPI Dateifunktionen

Hi,

ich habe folgendes Problem:
Ich öffne eine 2x2 Bitmap (70 Bytes) mit CreateFile -> kein Fehler.
Ich setzte den Dateizeiger mit SetFilePointerEx an den Anfang -> kein Fehler.
Jetzt will ich die Größe mit GetFileSizeEx abfragen -> liefert die Größe 0.
ReadFile liefert dann logischerweise auch nix.
Die Beiden Funktionen schlagen aber nicht fehl.
GetLastError liefert den Wert 0.

Hier noch mein Code:

C-/C++-Quelltext

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;
}
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

Mordrak

1x Contest-Sieger

Beiträge: 121

Wohnort: München

Beruf: Junior IT Consultant

  • Private Nachricht senden

2

30.11.2008, 13:24

Kann man den Rest der File-Klasse noch irgendwo sehen? Und liefert wirklich GetFileSizeEx() 0 als Dateigroesse, oder nur Dein Wrapper? Falls letzteres, wie sieht is_open() aus?

Gruesse,
Mordrak
What's yellow and equivalent to the axiom of choice? The Lemmon of Zorn!

3

30.11.2008, 16:13

Hi,

Ich bin ein Trottel :roll: . Ich hab die Bitmap in den Debugordner gelegt und hab nicht gesehn dass eine gleichnahmige Bitmap im Hauptverzeichnis des Projekts liegt. Beim Debugen hat vc++ dann die Bitmap im Hauptvezeichnis bevorzugt. (Die hatte wirklich 0 Bytes)

Trotzdem vielen Dank^^
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

Werbeanzeige