SpFile.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:7k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. /*
  2. Cross Platform Core Code.
  3. Copyright(R) 2001-2002 Balang Software.
  4. All rights reserved.
  5. Using:
  6. class CSPFile;
  7. */
  8. #include "StdAfx.h"
  9. #include "SpFile.h"
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #endif
  17. //////////////////////////////////////////////////////////////////////
  18. // CSPFile
  19. CSPFile::CSPFile()
  20. {
  21. m_hFile = (UINT) hFileNull;
  22. m_bCloseOnDelete = FALSE;
  23. }
  24. CSPFile::~CSPFile()
  25. {
  26. if (m_hFile != (UINT)hFileNull && m_bCloseOnDelete)
  27. Close();
  28. }
  29. BOOL CSPFile::Open(LPCTSTR lpszFileName, UINT nOpenFlags)
  30. {
  31. // if already opened, return FALSE.
  32. if( (UINT)hFileNull != m_hFile )
  33. {
  34. SP_TRACE0( "hFileNull != m_hFile" );
  35. SetLastError( errCSPFile_OpenFile );
  36. return FALSE;
  37. }
  38. SP_ASSERT_VALID(this);
  39. SP_ASSERT(SP_IsValidString(lpszFileName));
  40. SP_ASSERT((nOpenFlags & typeText) == 0);   // text mode not supported
  41. // CFile objects are always binary and CreateFile does not need flag
  42. nOpenFlags &= ~(UINT)typeBinary;
  43. m_bCloseOnDelete = FALSE;
  44. m_hFile = (UINT)hFileNull;
  45. SP_ASSERT((modeRead|modeWrite|modeReadWrite) == 3);
  46. int nAccess = 0;
  47. switch (nOpenFlags & 3)
  48. {
  49. case modeRead:
  50. nAccess = O_RDONLY;
  51. break;
  52. case modeWrite:
  53. nAccess = O_WRONLY;
  54. break;
  55. case modeReadWrite:
  56. nAccess = O_RDWR;
  57. break;
  58. default:
  59. SP_ASSERT(FALSE);  // invalid access mode
  60. }
  61. // no share mode
  62. SP_ASSERT( (nOpenFlags & 0x30) == 0 );
  63. // no inherit.
  64. SP_ASSERT( (nOpenFlags & 0x80) == 0 );
  65. // map create mode.
  66. if (nOpenFlags & modeCreate)
  67. {
  68. nAccess |= O_CREAT;
  69. if (nOpenFlags & modeNoTruncate)
  70. ;
  71. else
  72. nAccess |= O_TRUNC;
  73. }
  74. nAccess |= O_BINARY;
  75. UINT hFile = hFileNull;
  76. hFile = open( lpszFileName, nAccess, S_IREAD | S_IWRITE );
  77. if( hFileNull == hFile )
  78. return FALSE;
  79. m_hFile = (HFILE)hFile;
  80. m_bCloseOnDelete = TRUE;
  81. m_strFileName = lpszFileName;
  82. return TRUE;
  83. }
  84. BOOL CSPFile::CopyFile( LPCTSTR lpExistingFileName,
  85.    LPCTSTR lpNewFileName, BOOL bFailIfExists )
  86. {
  87. return ::CopyFile( lpExistingFileName, lpNewFileName, bFailIfExists );
  88. }
  89. UINT CSPFile::Read(void* lpBuf, UINT nCount)
  90. {
  91. SP_ASSERT_VALID(this);
  92. SP_ASSERT(m_hFile != (UINT)hFileNull);
  93. if (nCount == 0)
  94. return 0;   // avoid Win32 "null-read"
  95. SP_ASSERT(lpBuf != NULL);
  96. SP_ASSERT(SP_IsValidAddress(lpBuf, nCount));
  97. int nRet = read( m_hFile, lpBuf, nCount );
  98. if( nCount != (UINT)nRet )
  99. {
  100. SetLastError( errCFileSystem_ReadFile );
  101. //SP_ASSERT( FALSE );
  102. }
  103. return nRet;
  104. }
  105. void CSPFile::Write(const void* lpBuf, UINT nCount)
  106. {
  107. SP_ASSERT_VALID(this);
  108. SP_ASSERT(m_hFile != (UINT)hFileNull);
  109. if (nCount == 0)
  110. return;     // avoid Win32 "null-write" option
  111. SP_ASSERT(lpBuf != NULL);
  112. SP_ASSERT(SP_IsValidAddress((void *)lpBuf, nCount, FALSE));
  113. int nRet = write( m_hFile, lpBuf, nCount );
  114. if( nCount != (UINT)nRet )
  115. {
  116. SetLastError( errCFileSystem_WriteFile );
  117. SP_ASSERT( FALSE );
  118. }
  119. }
  120. void CSPFile::WriteString(LPCTSTR lpsz)
  121. {
  122. SP_ASSERT(SP_IsValidString(lpsz));
  123. Write(lpsz, lstrlen(lpsz) * sizeof(TCHAR));
  124. }
  125. LPTSTR CSPFile::ReadString(LPTSTR lpsz, UINT nMax)
  126. {
  127. // if nMax is negative (such a large number doesn't make sense given today's
  128. // 2gb address space), then assume it to mean "keep the newline".
  129. int nStop = (int)nMax < 0 ? -(int)nMax : (int)nMax;
  130. SP_ASSERT(SP_IsValidAddress(lpsz, (nStop+1) * sizeof(TCHAR)));
  131. TCHAR ch;
  132. int nRead = 0;
  133. lpsz[nRead] = '';
  134. while (nRead < nStop)
  135. {
  136. if( sizeof(TCHAR) != Read( &ch, sizeof(TCHAR) ) )
  137. {
  138. if( 0 == nRead )
  139. return NULL;
  140. }
  141. // stop and end-of-line (trailing 'n' is ignored)
  142. if (ch == 'r')
  143. continue;
  144. if (ch == 'n')
  145. {
  146. // store the newline when called with negative nMax
  147. if ((int)nMax != nStop)
  148. lpsz[nRead++] = ch;
  149. break;
  150. }
  151. lpsz[nRead++] = ch;
  152. }
  153. lpsz[nRead] = '';
  154. return lpsz;
  155. }
  156. BOOL CSPFile::ReadString( CSPString & rString )
  157. {
  158. rString.Empty();
  159. const int nMaxSize = 256;
  160. LPTSTR lpsz = rString.GetBuffer(nMaxSize);
  161. LPTSTR lpszResult;
  162. int nLen;
  163. for (;;)
  164. {
  165. lpszResult = ReadString(lpsz, (UINT)-nMaxSize); // store the newline
  166. rString.ReleaseBuffer();
  167. // if string is read completely or EOF
  168. if (lpszResult == NULL ||
  169. (nLen = lstrlen(lpsz)) < nMaxSize ||
  170. lpsz[nLen-1] == 'n')
  171. {
  172. break;
  173. }
  174. nLen = rString.GetLength();
  175. lpsz = rString.GetBuffer(nMaxSize + nLen) + nLen;
  176. }
  177. // remove 'n' from end of string if present
  178. lpsz = rString.GetBuffer(0);
  179. nLen = rString.GetLength();
  180. if (nLen != 0 && lpsz[nLen-1] == 'n')
  181. rString.GetBufferSetLength(nLen-1);
  182. return lpszResult != NULL;
  183. }
  184. LONG CSPFile::Seek(LONG lOff, UINT nFrom)
  185. {
  186. SP_ASSERT_VALID(this);
  187. SP_ASSERT(m_hFile != (UINT)hFileNull);
  188. SP_ASSERT(nFrom == begin || nFrom == end || nFrom == current);
  189. #ifdef SP_WIN32
  190. SP_ASSERT(begin == FILE_BEGIN && end == FILE_END && current == FILE_CURRENT);
  191. #endif
  192. UINT nOrgin = -1;
  193. if( nFrom == begin )
  194. nOrgin = SEEK_SET;
  195. if( nFrom == end )
  196. nOrgin = SEEK_END;
  197. if( nFrom == current )
  198. nOrgin = SEEK_CUR;
  199. SP_ASSERT( SEEK_SET == nOrgin || SEEK_CUR == nOrgin || SEEK_END == nOrgin );
  200. if( nOrgin == -1 )
  201. {
  202. SetLastError( errCSPFile_SeekFile );
  203. return -1;
  204. }
  205. LONG lnRet = lseek( m_hFile, lOff, nOrgin );
  206. if( -1 == lnRet )
  207. SetLastError( errCSPFile_SeekFile );
  208. return lnRet;
  209. }
  210. void CSPFile::Flush()
  211. {
  212. SP_ASSERT_VALID(this);
  213. if (m_hFile == (UINT)hFileNull)
  214. return;
  215. _commit( m_hFile );
  216. }
  217. void CSPFile::Close()
  218. {
  219. SP_ASSERT_VALID(this);
  220. SP_ASSERT(m_hFile != (UINT)hFileNull);
  221. if( hFileNull != m_hFile )
  222. {
  223. if( -1 == close( m_hFile ) )
  224. {
  225. SetLastError( errCSPFile_CloseFile );
  226. SP_ASSERT( FALSE );
  227. }
  228. m_hFile = hFileNull;
  229. }
  230. m_hFile = (UINT) hFileNull;
  231. m_bCloseOnDelete = FALSE;
  232. m_strFileName.Empty();
  233. }
  234. void CSPFile::Abort()
  235. {
  236. SP_ASSERT_VALID(this);
  237. if (m_hFile != (UINT)hFileNull)
  238. {
  239. // close but ignore errors
  240. close( m_hFile );
  241. m_hFile = (UINT)hFileNull;
  242. }
  243. m_strFileName.Empty();
  244. }
  245. void CSPFile::SeekToBegin()
  246. {
  247. Seek( 0, begin );
  248. }
  249. DWORD CSPFile::SeekToEnd()
  250. {
  251. return Seek( 0, end );
  252. }
  253. DWORD CSPFile::GetLength() const
  254. {
  255. SP_ASSERT_VALID(this);
  256. DWORD dwLen, dwCur;
  257. // Seek is a non const operation
  258. CSPFile *pFile = (CSPFile*)this;
  259. dwCur = pFile->Seek(0L, current);
  260. dwLen = pFile->SeekToEnd();
  261. SP_VERIFY(dwCur == (DWORD)pFile->Seek(dwCur, begin));
  262. return dwLen;
  263. }
  264. DWORD CSPFile::GetPosition() const
  265. {
  266. SP_ASSERT_VALID(this);
  267. SP_ASSERT(m_hFile != (UINT)hFileNull);
  268. DWORD dwPos = lseek( m_hFile, 0, SEEK_CUR );
  269. return dwPos;
  270. }
  271. #ifdef _DEBUG
  272. void CSPFile::Dump() const
  273. {
  274. Object::Dump( );
  275. }
  276. void CSPFile::AssertValid() const
  277. {
  278. Object::AssertValid();
  279. if( m_hFile == UINT(hFileNull) )
  280. {
  281. SP_ASSERT(m_strFileName.IsEmpty());
  282. }
  283. }
  284. #endif // _DEBUG
  285. // CSPFile does not support direct buffering (CMemFile does)
  286. UINT CSPFile::GetBufferPtr(UINT nCommand, UINT /*nCount*/,
  287. void** /*ppBufStart*/, void** /*ppBufMax*/)
  288. {
  289. SP_ASSERT(nCommand == bufferCheck);
  290. UNUSED(nCommand);    // not used in retail build
  291. return 0;   // no support
  292. }