내가 2013 년는 InternetReadFile을 버퍼를 작성하지만, 반환 0 바이트는
BOOL WWW::Read(char* buffer, DWORD buffer_size)
{
memset(buffer, 0, buffer_size);
m_dwBytesRead = 0;
BOOL bResult = InternetReadFile(m_handle, buffer, buffer_size, &m_dwBytesRead);
if (!bResult)
{
DWORD dwLastError = GetLastError();
TCHAR *err;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, dwLastError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language
(LPTSTR)&err, 0, NULL))
{
LOGMSG(1, (TEXT("InternetReadFile failed at - (%u) %s\r\n"), dwLastError, err));
LocalFree(err);
}
}
// FUDGE
if (m_dwBytesRead == 0)
{
DWORD dwZeros = countZeros(buffer, buffer_size);
if (dwZeros < buffer_size)
{
m_dwBytesRead = buffer_size;
}
}
// END OF FUDGE
return bResult;
}
나는 반복적으로 전화를 윈도우 컴팩트 위해 작성된 C++ 응용 프로그램 내에서 인터넷에서 파일을 다운로드하는 동안 아주 이상한 문제가있어 읽기 다른 멤버 함수의 기능 이상으로이 기능을 통해 처음 실패하고 후속 호출이 제대로 작동하지 않고 연한 캔디
DWORD dwWritten;
while (!(Read(buffer, DOWNLOAD_BUFFER_SIZE) && m_dwBytesRead == 0))
{
WriteFile(m_hDownload, buffer, m_dwBytesRead, &dwWritten, NULL);
m_dwActualSize += dwWritten;
++m_dwChunks;
if (m_dwBytesRead > 0)
m_dwInactivity = 0;
else if (++m_dwInactivity > INACTIVITY_LIMIT)
return WDS_INACTIVITY;
}
따른다. 나는이 함수 호출을 통해 첫 번째 패스에서 얻을 오류가 나는 READ 작업 중 오류 "디스크에 공간이 부족합니다"는을 받고해야하는 이유 이해가 안
InternetReadFile failed at - (112) There is not enough space on the disk.
입니다. 버퍼가 할당되고 사용 가능하며 예상되는 크기와 일치하는지 확인했습니다. 사실 버퍼의 내용을 검사 할 때 예상되는 바이트 수로 채워져 있지만 m_dwBytesRead 변수의 내용은 여전히 0으로 설정되어 있습니다.
버퍼의 내용을 검사하여 코드가 채워 졌는지 확인한 다음 m_dwBytesRead 변수를 푸싱하여이 특정 사례를 중심으로 코딩 할 수 있지만 이는이 오류를 지나치게 임시로 해결하기위한 조치 일 뿐이며, 문제가 발생했습니다.
내 퍼지가 아닌이 오류의 결과는 데이터가 버려지고 첫 번째 블록이 누락되었지만 그렇지 않으면 완전히 수정 된 파일로 끝나는 것입니다. 따라서 MD5 검사가 실패하고 파일의 첫 번째 부분이 누락되었습니다.
파일이 항상 내가 사용하는 블록 크기보다 클 것이므로 퍼지 기능이 작동하지만 코드에서 이러한 끔찍한 해결 방법을 사용하는 것이 좋지 않습니다. 필요합니다.
누구든지 문제의 원인을 밝힐 수 있다면 크게 환영 할 것입니다. 난 비주얼 스튜디오 2013 C++ (네이티브 Windows 응용 프로그램이 아닌 MFC)를 사용하고
은, 대상이 2013 년
많은 감사, 32 비트 및 유니 코드 윈도우 컴팩트에서 실행 앤드류
"일반"Windows에서 실행하면 어떻게됩니까? – Anders
제안 해 주셔서 감사합니다. 나는 일반 창문에서 그것을 시도하지 않았다. 나는 확실히 그것을 (월요일에) 시험해보고 다른 행동이 있는지 알아볼 수있다. – pionium
더 나은 해결 방법 (작동하는 경우)은 항상 첫 번째 읽기, 항상 길이가 0 인 읽기를 수행하는 것일 수 있습니다. –