RFile.cpp
上传用户:hmc_gdtv
上传日期:2013-08-04
资源大小:798k
文件大小:4k
源码类别:

Windows Mobile

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2001,2002,2003 Mike Matsnev.  All Rights Reserved.
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  *
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice immediately at the beginning of the file, without modification,
  10.  *    this list of conditions, and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. Absolutely no warranty of function or purpose is made by the author
  15.  *    Mike Matsnev.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * 
  28.  * $Id: RFile.cpp,v 1.6.2.2 2004/07/07 12:04:47 mike Exp $
  29.  * 
  30.  */
  31. #include <afxwin.h>
  32. #include "ptr.h"
  33. #include "RFile.h"
  34. #include "TextViewNG.h"
  35. int RFile::BSZ=16384;
  36. int RFile::BMASK=~16383;
  37. void  RFile::InitBufSize() {
  38.   int rfbs=CTVApp::GetInt(_T("FileBufSize"),16384);
  39.   if (rfbs<8192)
  40.     rfbs=8192;
  41.   if (rfbs>1048576)
  42.     rfbs=1048576;
  43.   int fbs=8192;
  44.   while ((fbs<<1)<=rfbs)
  45.     fbs<<=1;
  46.   BSZ=fbs;
  47.   BMASK=~(fbs-1);
  48. }
  49. CString FileExceptionInfo(const CString& filename,DWORD dwErr) {
  50.   CString ret;
  51.   TCHAR   *buf = ret.GetBuffer(1024);
  52.   FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,dwErr,LANG_USER_DEFAULT,buf,1024,NULL);
  53.   ret.ReleaseBuffer();
  54.   return filename + _T(": ") + ret;
  55. }
  56. CString FileName(const CString& file) {
  57.   return file.Right(file.GetLength()-max(file.ReverseFind(_T('/')),
  58.     file.ReverseFind(_T('\')))-1);
  59. }
  60. void RFile::ShowError() {
  61.   if (m_diderror)
  62.     return;
  63.   m_diderror = true;
  64.   DWORD dwErr = GetLastError();
  65.   AfxMessageBox(FileExceptionInfo(m_fn,dwErr),MB_ICONERROR|MB_OK,0);
  66. }
  67. bool  RFile::Reopen() {
  68.   if (m_didreopen)
  69.     return false;
  70.   if (m_fh != INVALID_HANDLE_VALUE) {
  71.     CloseHandle(m_fh);
  72.     m_fh = INVALID_HANDLE_VALUE;
  73.   }
  74.   HANDLE fh = CreateFile(m_fn,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
  75.   if (fh == INVALID_HANDLE_VALUE) {
  76.     m_didreopen = true;
  77.     return false;
  78.   }
  79.   m_fh = fh;
  80.   SetFilePointer(fh, m_ptr, NULL, FILE_BEGIN);
  81.   return true;
  82. }
  83. // to avoid dealing with exceptions we access the file handle directly
  84. DWORD RFile::size() {
  85.   DWORD ret = GetFileSize(m_fh,NULL);
  86.   if (ret == 0xffffffff) {
  87.     if (GetLastError()==1617) {
  88.       if (!Reopen()) {
  89. AfxMessageBox(_T("Can't reopen file."),MB_ICONERROR|MB_OK,0);
  90. return 0;
  91.       }
  92.       ret = GetFileSize(m_fh,NULL);
  93.       if (ret == 0xffffffff)
  94. goto err;
  95.     } else {
  96. err:
  97.       ShowError();
  98.       ret = 0;
  99.     }
  100.   }
  101.   return ret;
  102. }
  103. DWORD RFile::read(void *buf) { return read2(buf,BSZ); }
  104. DWORD RFile::read2(void *buf,DWORD size) {
  105.   DWORD rd = 0;
  106.   if (!ReadFile(m_fh,buf,size,&rd,NULL)) {
  107.     if (GetLastError() == 1617) {
  108.       if (!Reopen()) {
  109. AfxMessageBox(_T("Can't reopen file."),MB_ICONERROR|MB_OK,0);
  110. return 0;
  111.       }
  112.       if (!ReadFile(m_fh,buf,size,&rd,NULL))
  113. ShowError();
  114.     } else
  115.       ShowError();
  116.   }
  117.   m_ptr += rd;
  118.   return rd;
  119. }
  120. void  RFile::seek2(DWORD pos,DWORD how) {
  121.   DWORD np;
  122.   if ((np = SetFilePointer(m_fh,pos,NULL,how)) == 0xffffffff) {
  123.     if (GetLastError() == 1617) {
  124.       if (!Reopen()) {
  125. AfxMessageBox(_T("Can't reopen file."),MB_ICONERROR|MB_OK,0);
  126. return;
  127.       }
  128.       if ((np = SetFilePointer(m_fh,pos,NULL,how)) == 0xffffffff)
  129. ShowError();
  130.     } else
  131.       ShowError();
  132.   }
  133.   if (np != 0xffffffff)
  134.     m_ptr = np;
  135. }
  136. void  RFile::seek(DWORD pos) { seek2(pos,FILE_BEGIN); }
  137. DWORD RFile::pos() {
  138.   return m_ptr;
  139. }