File64.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. // File64.cpp: implementation of the CFile64 class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "File64.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. //////////////////////////////////////////////////////////////////////
  12. // Construction/Destruction
  13. //////////////////////////////////////////////////////////////////////
  14. CFile64::CFile64()
  15. {
  16. }
  17. CFile64::~CFile64()
  18. {
  19. }
  20. ULONGLONG CFile64::Seek(LONGLONG lOff, UINT nFrom)
  21. {
  22. ASSERT_VALID(this);
  23. ASSERT((HANDLE)m_hFile != INVALID_HANDLE_VALUE);
  24. ASSERT(nFrom == begin || nFrom == end || nFrom == current);
  25. ASSERT(begin == FILE_BEGIN && end == FILE_END && current == FILE_CURRENT);
  26. LARGE_INTEGER liOff;
  27. liOff.QuadPart = lOff;
  28. liOff.LowPart = ::SetFilePointer((HANDLE)m_hFile, liOff.LowPart, &liOff.HighPart,
  29. (DWORD)nFrom);
  30. if (liOff.LowPart == (DWORD)-1)
  31. if (::GetLastError() != NO_ERROR)
  32. CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName);
  33. return liOff.QuadPart;
  34. }
  35. ULONGLONG CFile64::GetPosition()
  36. {
  37. ASSERT_VALID(this);
  38. ASSERT((HANDLE)m_hFile != INVALID_HANDLE_VALUE);
  39. LARGE_INTEGER liPos;
  40. liPos.QuadPart = 0;
  41. liPos.LowPart = ::SetFilePointer((HANDLE)m_hFile, liPos.LowPart, &liPos.HighPart , FILE_CURRENT);
  42. if (liPos.LowPart == (DWORD)-1)
  43. if (::GetLastError() != NO_ERROR)
  44. CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName);
  45. return liPos.QuadPart;
  46. }
  47. void CFile64::LockRange(ULONGLONG dwPos, ULONGLONG dwCount)
  48. {
  49. ASSERT_VALID(this);
  50. ASSERT((HANDLE)m_hFile != INVALID_HANDLE_VALUE);
  51. ULARGE_INTEGER liPos;
  52. ULARGE_INTEGER liCount;
  53. liPos.QuadPart = dwPos;
  54. liCount.QuadPart = dwCount;
  55. if (!::LockFile((HANDLE)m_hFile, liPos.LowPart, liPos.HighPart, liCount.LowPart,
  56. liCount.HighPart))
  57. {
  58. CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName);
  59. }
  60. }
  61. void CFile64::UnlockRange(ULONGLONG dwPos, ULONGLONG dwCount)
  62. {
  63. ASSERT_VALID(this);
  64. ASSERT((HANDLE)m_hFile != INVALID_HANDLE_VALUE);
  65. ULARGE_INTEGER liPos;
  66. ULARGE_INTEGER liCount;
  67. liPos.QuadPart = dwPos;
  68. liCount.QuadPart = dwCount;
  69. if (!::UnlockFile((HANDLE)m_hFile, liPos.LowPart, liPos.HighPart, liCount.LowPart,
  70. liCount.HighPart))
  71. {
  72. CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName);
  73. }
  74. }
  75. void CFile64::SetLength(ULONGLONG dwNewLen)
  76. {
  77. ASSERT_VALID(this);
  78. ASSERT((HANDLE)m_hFile != INVALID_HANDLE_VALUE);
  79. Seek(dwNewLen, (UINT)begin);
  80. if (!::SetEndOfFile((HANDLE)m_hFile))
  81. CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName);
  82. }
  83. ULONGLONG CFile64::GetLength()
  84. {
  85. ASSERT_VALID(this);
  86. ULARGE_INTEGER liSize;
  87. liSize.LowPart = ::GetFileSize((HANDLE)m_hFile, &liSize.HighPart);
  88. if (liSize.LowPart == (DWORD)-1)
  89. if (::GetLastError() != NO_ERROR)
  90. CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName);
  91. return liSize.QuadPart;
  92. }
  93. bool IsValidFILETIME(FILETIME& fileTime)
  94. {
  95. FILETIME localTime;
  96. if (!FileTimeToLocalFileTime(&fileTime, &localTime))
  97. {
  98. return FALSE;
  99. }
  100. // then convert that time to system time
  101. SYSTEMTIME sysTime;
  102. if (!FileTimeToSystemTime(&localTime, &sysTime))
  103. {
  104. return FALSE;
  105. }
  106. return TRUE;
  107. }
  108. BOOL CFile64::GetStatus(LPCTSTR lpszFileName, CFileStatus64& rStatus)
  109. {
  110. ASSERT( lpszFileName != NULL );
  111. if ( lpszFileName == NULL )
  112. {
  113. return FALSE;
  114. }
  115. if ( lstrlen(lpszFileName) >= _MAX_PATH )
  116. {
  117. ASSERT(FALSE); // MFC requires paths with length < _MAX_PATH
  118. return FALSE;
  119. }
  120. // attempt to fully qualify path first
  121. ZeroMemory(rStatus.m_szFullName,sizeof(rStatus.m_szFullName));
  122. memcpy(rStatus.m_szFullName,lpszFileName,strlen((char*)lpszFileName));
  123. //if (!AfxFullPath(rStatus.m_szFullName, lpszFileName))
  124. //{
  125. // rStatus.m_szFullName[0] = '\0';
  126. // return FALSE;
  127. //}
  128. WIN32_FIND_DATA findFileData;
  129. HANDLE hFind = FindFirstFile((LPTSTR)lpszFileName, &findFileData);
  130. if (hFind == INVALID_HANDLE_VALUE)
  131. return FALSE;
  132. VERIFY(FindClose(hFind));
  133. // strip attribute of NORMAL bit, our API doesn't have a "normal" bit.
  134. rStatus.m_attribute = (BYTE)
  135. (findFileData.dwFileAttributes & ~FILE_ATTRIBUTE_NORMAL);
  136. // get just the low DWORD of the file size
  137. //ASSERT(findFileData.nFileSizeHigh == 0);
  138. //rStatus.m_size = (LONG)findFileData.nFileSizeLow;
  139. rStatus.m_size = ((ULONGLONG)findFileData.nFileSizeHigh<<32) + findFileData.nFileSizeLow;
  140. // convert times as appropriate
  141. if (IsValidFILETIME(findFileData.ftCreationTime))
  142. {
  143. rStatus.m_ctime = CTime(findFileData.ftCreationTime);
  144. }
  145. else
  146. {
  147. rStatus.m_ctime = CTime();
  148. }
  149. if (IsValidFILETIME(findFileData.ftLastAccessTime))
  150. {
  151. rStatus.m_atime = CTime(findFileData.ftLastAccessTime);
  152. }
  153. else
  154. {
  155. rStatus.m_atime = CTime();
  156. }
  157. if (IsValidFILETIME(findFileData.ftLastWriteTime))
  158. {
  159. rStatus.m_mtime = CTime(findFileData.ftLastWriteTime);
  160. }
  161. else
  162. {
  163. rStatus.m_mtime = CTime();
  164. }
  165. if (rStatus.m_ctime.GetTime() == 0)
  166. rStatus.m_ctime = rStatus.m_mtime;
  167. if (rStatus.m_atime.GetTime() == 0)
  168. rStatus.m_atime = rStatus.m_mtime;
  169. return TRUE;
  170. }