Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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-)



	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);

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.

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.

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)

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?

ich will Sie aber nicht auf der Festplatte speichern. Nur Auslesen und anzeigen. So einfach mach ich es mir nun auch nicht. ;-)

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.