File64.cpp
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:4k
源码类别:

VC书籍

开发平台:

Visual C++

  1. // VirtualDub - Video processing and capture application
  2. // Copyright (C) 1998-2001 Avery Lee
  3. //
  4. // This program is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation; either version 2 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with this program; if not, write to the Free Software
  16. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. #include <windows.h>
  18. #include "Error.h"
  19. #include "File64.h"
  20. // hack...
  21. extern CRITICAL_SECTION g_diskcs;
  22. ////////////
  23. File64::File64() {
  24. }
  25. File64::File64(HANDLE _hFile, HANDLE _hFileUnbuffered)
  26. : hFile(_hFile), hFileUnbuffered(_hFileUnbuffered)
  27. {
  28. i64FilePosition = 0;
  29. }
  30. long File64::_readFile(void *data, long len) {
  31. DWORD dwActual;
  32. if (!ReadFile(hFile, data, len, &dwActual, NULL))
  33. return -1;
  34. i64FilePosition += dwActual;
  35. return (long)dwActual;
  36. }
  37. void File64::_readFile2(void *data, long len) {
  38. long lActual = _readFile(data, len);
  39. if (lActual < 0)
  40. throw MyWin32Error("Failure reading file: %%s.",GetLastError());
  41. if (lActual != len)
  42. throw MyError("Failure reading file: Unexpected end of file");
  43. }
  44. bool File64::_readChunkHeader(FOURCC& pfcc, DWORD& pdwLen) {
  45. DWORD dw[2];
  46. long actual;
  47. actual = _readFile(dw, 8);
  48. if (actual != 8)
  49. return false;
  50. pfcc = dw[0];
  51. pdwLen = dw[1];
  52. return true;
  53. }
  54. void File64::_seekFile(__int64 i64NewPos) {
  55. LONG lHi = (LONG)(i64NewPos>>32);
  56. DWORD dwError;
  57. if (0xFFFFFFFF == SetFilePointer(hFile, (LONG)i64NewPos, &lHi, FILE_BEGIN))
  58. if ((dwError = GetLastError()) != NO_ERROR)
  59. throw MyWin32Error("File64: %%s", dwError);
  60. i64FilePosition = i64NewPos;
  61. }
  62. bool File64::_seekFile2(__int64 i64NewPos) {
  63. LONG lHi = (LONG)(i64NewPos>>32);
  64. DWORD dwError;
  65. // _RPT1(0,"Seeking to %I64dn", i64NewPos);
  66. if (0xFFFFFFFF == SetFilePointer(hFile, (LONG)i64NewPos, &lHi, FILE_BEGIN))
  67. if ((dwError = GetLastError()) != NO_ERROR)
  68. return false;
  69. i64FilePosition = i64NewPos;
  70. return true;
  71. }
  72. void File64::_skipFile(__int64 bytes) {
  73. LONG lHi = (LONG)(bytes>>32);
  74. DWORD dwError;
  75. LONG lNewLow;
  76. if (0xFFFFFFFF == (lNewLow = SetFilePointer(hFile, (LONG)bytes, &lHi, FILE_CURRENT)))
  77. if ((dwError = GetLastError()) != NO_ERROR)
  78. throw MyWin32Error("File64: %%s", dwError);
  79. i64FilePosition = (unsigned long)lNewLow | (((__int64)(unsigned long)lHi)<<32);
  80. }
  81. bool File64::_skipFile2(__int64 bytes) {
  82. LONG lHi = (LONG)(bytes>>32);
  83. DWORD dwError;
  84. LONG lNewLow;
  85. if (0xFFFFFFFF == (lNewLow = SetFilePointer(hFile, (LONG)bytes, &lHi, FILE_CURRENT)))
  86. if ((dwError = GetLastError()) != NO_ERROR)
  87. return false;
  88. i64FilePosition = (unsigned long)lNewLow | (((__int64)(unsigned long)lHi)<<32);
  89. return true;
  90. }
  91. long File64::_readFileUnbuffered(void *data, long len) {
  92. DWORD dwActual;
  93. EnterCriticalSection(&g_diskcs);
  94. if (!ReadFile(hFileUnbuffered, data, len, &dwActual, NULL)) {
  95. LeaveCriticalSection(&g_diskcs);
  96. return -1;
  97. }
  98. LeaveCriticalSection(&g_diskcs);
  99. return (long)dwActual;
  100. }
  101. void File64::_seekFileUnbuffered(__int64 i64NewPos) {
  102. LONG lHi = (LONG)(i64NewPos>>32);
  103. DWORD dwError;
  104. if (0xFFFFFFFF == SetFilePointer(hFileUnbuffered, (LONG)i64NewPos, &lHi, FILE_BEGIN))
  105. if ((dwError = GetLastError()) != NO_ERROR)
  106. throw MyWin32Error("File64: %%s", dwError);
  107. }
  108. __int64 File64::_posFile() {
  109. return i64FilePosition;
  110. }
  111. __int64 File64::_sizeFile() {
  112. DWORD dwLow, dwHigh;
  113. DWORD dwError;
  114. dwLow = GetFileSize(hFile, &dwHigh);
  115. if (dwLow == 0xFFFFFFFF && (dwError = GetLastError()) != NO_ERROR)
  116. throw MyWin32Error("Cannot determine file size: %%s", dwError);
  117. return ((__int64)dwHigh << 32) | (unsigned long)dwLow;
  118. }