www.pudn.com > XvidQP.rar > File64.cpp
// VirtualDub - Video processing and capture application // Copyright (C) 1998-2001 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include#include "Error.h" #include "File64.h" // hack... extern CRITICAL_SECTION g_diskcs; //////////// File64::File64() { } File64::File64(HANDLE _hFile, HANDLE _hFileUnbuffered) : hFile(_hFile), hFileUnbuffered(_hFileUnbuffered) { i64FilePosition = 0; } long File64::_readFile(void *data, long len) { DWORD dwActual; if (!ReadFile(hFile, data, len, &dwActual, NULL)) return -1; i64FilePosition += dwActual; return (long)dwActual; } void File64::_readFile2(void *data, long len) { long lActual = _readFile(data, len); if (lActual < 0) throw MyWin32Error("Failure reading file: %%s.",GetLastError()); if (lActual != len) throw MyError("Failure reading file: Unexpected end of file"); } bool File64::_readChunkHeader(FOURCC& pfcc, DWORD& pdwLen) { DWORD dw[2]; long actual; actual = _readFile(dw, 8); if (actual != 8) return false; pfcc = dw[0]; pdwLen = dw[1]; return true; } void File64::_seekFile(__int64 i64NewPos) { LONG lHi = (LONG)(i64NewPos>>32); DWORD dwError; if (0xFFFFFFFF == SetFilePointer(hFile, (LONG)i64NewPos, &lHi, FILE_BEGIN)) if ((dwError = GetLastError()) != NO_ERROR) throw MyWin32Error("File64: %%s", dwError); i64FilePosition = i64NewPos; } bool File64::_seekFile2(__int64 i64NewPos) { LONG lHi = (LONG)(i64NewPos>>32); DWORD dwError; // _RPT1(0,"Seeking to %I64d\n", i64NewPos); if (0xFFFFFFFF == SetFilePointer(hFile, (LONG)i64NewPos, &lHi, FILE_BEGIN)) if ((dwError = GetLastError()) != NO_ERROR) return false; i64FilePosition = i64NewPos; return true; } void File64::_skipFile(__int64 bytes) { LONG lHi = (LONG)(bytes>>32); DWORD dwError; LONG lNewLow; if (0xFFFFFFFF == (lNewLow = SetFilePointer(hFile, (LONG)bytes, &lHi, FILE_CURRENT))) if ((dwError = GetLastError()) != NO_ERROR) throw MyWin32Error("File64: %%s", dwError); i64FilePosition = (unsigned long)lNewLow | (((__int64)(unsigned long)lHi)<<32); } bool File64::_skipFile2(__int64 bytes) { LONG lHi = (LONG)(bytes>>32); DWORD dwError; LONG lNewLow; if (0xFFFFFFFF == (lNewLow = SetFilePointer(hFile, (LONG)bytes, &lHi, FILE_CURRENT))) if ((dwError = GetLastError()) != NO_ERROR) return false; i64FilePosition = (unsigned long)lNewLow | (((__int64)(unsigned long)lHi)<<32); return true; } long File64::_readFileUnbuffered(void *data, long len) { DWORD dwActual; EnterCriticalSection(&g_diskcs); if (!ReadFile(hFileUnbuffered, data, len, &dwActual, NULL)) { LeaveCriticalSection(&g_diskcs); return -1; } LeaveCriticalSection(&g_diskcs); return (long)dwActual; } void File64::_seekFileUnbuffered(__int64 i64NewPos) { LONG lHi = (LONG)(i64NewPos>>32); DWORD dwError; if (0xFFFFFFFF == SetFilePointer(hFileUnbuffered, (LONG)i64NewPos, &lHi, FILE_BEGIN)) if ((dwError = GetLastError()) != NO_ERROR) throw MyWin32Error("File64: %%s", dwError); } __int64 File64::_posFile() { return i64FilePosition; } __int64 File64::_sizeFile() { DWORD dwLow, dwHigh; DWORD dwError; dwLow = GetFileSize(hFile, &dwHigh); if (dwLow == 0xFFFFFFFF && (dwError = GetLastError()) != NO_ERROR) throw MyWin32Error("Cannot determine file size: %%s", dwError); return ((__int64)dwHigh << 32) | (unsigned long)dwLow; }