Babybaer Geschrieben 22. Oktober 2004 Geschrieben 22. Oktober 2004 Hallo,ich lese mit der Methode 'InternetReadFile' auf meinem Server ein Textfile aus. Bis 32 KB ist das kein Problem. Aber alles was darüber liegt, will nicht. Habe so was noch nicht gemacht. Wie bekomme ich ein x beliebig großes Textfiles in meinen StringDatentyp. Ein kleines Beispiel oder was zum nachlesen wäre nicht schlecht. Danke. VS7.0 Zitieren
Crush Geschrieben 22. Oktober 2004 Geschrieben 22. Oktober 2004 Hallo, wieder hart am Schaffen? Wo tritt der Fehler denn genau auf und was für einen Stringtyp verwendest Du? Eine Zeile Code wäre nicht schlecht um zu sehen, wie Du den Buffer vom String füllst. Wenn ich davon mal ausgehe, daß Du einen CString beschreiben willst, dann kannst Du mit GetBufferSetLength() die Maximalgröße festlegen - der Inhalt geht dabei übrigens nicht verloren. Danach kannst Du den Stringbuffer direkt beschreiben. Das Füllen mit 0ern ist nur notwendig, wenn man den String bis zum ersten 0er als Stringende clippen will. Ansonsten kann man den String wie ein char-Array verwenden, direkt auf den Speicher zugreifen und mit Zeiger durchiterieren, usw. Da Dir die Stringlänge vom Internetfile nicht bekannt ist, kannst Du ja mal mit einem 32 KB-Buffer arbeiten, den String resizen und dann in den nächsten 32 KB Block weiter einlesen. Sobald alles fertig ist die Gesamtstringlänge selber festsetzen oder eben mit ReleaseBuffer() die Stringlänge automatisch passend zurecht schneiden lassen. CString string("=8-)"); // wird nicht verändert beim Resize() des Buffers string.GetBufferSetLength(500000); // hier wird die Größe festgelegt, Inhalte bleiben erhalten ZeroMemory(string.GetBuffer(),string.GetLength()); // mit 0er-Bytes fürs Clippen auffüllen, sofern benötigt memcpy(string.GetBuffer(),"test",4); // irgendein teststring memcpy(string.GetBuffer()+4,"\0test2",6); // hier noch einer, damit man das mit dem 0er richtig sieht // string.ReleaseBuffer(); // clippt den String von links bis zum ersten 0er-Zeichen string.GetBufferSetLength(10); // setzt die Stringlänge "hart" auf die befüllte Größe, damit 0er nicht untergehen // ACHTUNG! Ausgaberoutinen können abstürzen, wenn man so einen String überreicht! string.Replace(0x0,'_'); // Für eine MessageBox z.B. müßte man die 0er vor der Ausgabe ersetzen AfxMessageBox(string); Übrigens: Ich bin heute zu Hause, kannst mich da ja anrufen, wenn Du noch Fragen hast =8-) Zitieren
Babybaer Geschrieben 22. Oktober 2004 Autor Geschrieben 22. Oktober 2004 LPDWORD lpdwFileSizeHigh = NULL; volatile char * szbuffer; szbuffer = NULL; try { bResult = FtpSetCurrentDirectory(m_hConnect,csDirectory + _T("/")); hFile = FtpOpenFile(m_hConnect, csFileName, GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0); if(hFile == NULL) { return FALSE; } pdwFileSize = ::FtpGetFileSize(hFile,lpdwFileSizeHigh); if(szbuffer == NULL) szbuffer = (char*)::VirtualAlloc(NULL, pdwFileSize+1, MEM_COMMIT, PAGE_READWRITE); ASSERT(szbuffer); bResult = InternetReadFile(hFile, (void*)(csTest), pdwFileSize, &pdwFileSize); Zitieren
Crush Geschrieben 22. Oktober 2004 Geschrieben 22. Oktober 2004 Der VirtualAlloc ist das Problem: dwSize [in] Specifies the size, in bytes, of the region. If the lpAddress parameter is NULL, this value is rounded up to the next page boundary. Otherwise, the allocated pages include all pages containing one or more bytes in the range from lpAddress to (lpAddress+dwSize). This means that a 2-byte range straddling a page boundary causes both pages to be included in the allocated region. Es wird nur im Bereich von einem Wortoffset Speicher reserviert, weil immer maximal innerhalb einer Memory-Page Speicher verwendet wird. Diese sind eben maximal 0x10000 Bytes groß. Das bedeutet, hiermit kommst Du nicht weiter. Mach ein normales NEW oder verwendet mehrere 65K-Blöcke und fülle diese hintereinander auf, dann klappt´s auch. Zitieren
Klotzkopp Geschrieben 22. Oktober 2004 Geschrieben 22. Oktober 2004 Laut MSDN Library liest InternetReadFile nicht zwangsläufig die ganze Datei auf einmal ein. Du musst InternetReadFile solange aufrufen, bis es TRUE zurückgibt und die Anzahl der eingelesenen Bytes 0 ist. Du darfst übrigens für Parameter 3 und 4 nicht dieselbe Variable benutzen, denn bevor InternetReadFile irgendwas anderes macht, setzt es die Variable, auf die Parameter 4 zeigt, auf 0. Zitieren
Crush Geschrieben 22. Oktober 2004 Geschrieben 22. Oktober 2004 Die beiden Fehler ergänzen sich ja hervorragend! Ich frage mich aber wegen der 4. Variable, wieso dann wohl kleine Dateien als 65KB übertragen worden sein sollen??!?! (bzw. 32K widechars) Zitieren
Babybaer Geschrieben 22. Oktober 2004 Autor Geschrieben 22. Oktober 2004 Das ist gerade mein letzter Versuch gewesen. Ich habe auch schon andere Möglichkeiten versucht. Ich werde es am Montag gleich mal versuchen. Was für einen Datentyp wäre dann hier angebracht? TCHAR? Zitieren
Guybrush Threepwood Geschrieben 22. Oktober 2004 Geschrieben 22. Oktober 2004 Was willst du denn mit der Textfile machen? Wenn du sie auf der Festplatte speicher nwillst wäre es doch am Besten sie in einer Schleife stückchen weise zu lesen und lokal zu speichern. Zitieren
Babybaer Geschrieben 24. Oktober 2004 Autor Geschrieben 24. Oktober 2004 ich will Sie aber nicht auf der Festplatte speichern. Nur Auslesen und anzeigen. So einfach mach ich es mir nun auch nicht. ;-) Zitieren
Babybaer Geschrieben 26. Oktober 2004 Autor Geschrieben 26. Oktober 2004 Ich habe den BUG bei mir gefunden. Also ich kann jetzt große Files auslesen, leider habe ich nicht darauf geachtet das ich einmal ANSI und UNICODE habe. Deswegen habe ich auch nur einen Teil bzw. irgend welche Zeichen zurück bekommen. Und bei den kleinen Files war es zufällig ANSI. :floet: . Das Problem besteht jetzt nur noch darin, wie bekomme ich vor dem Auslesen mit, ob es ANSI oder UNICODE ist??? Naja werde es hinbekommen. Danke noch mal an alle. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.