atlwfile.h
上传用户:hy_wanghao
上传日期:2007-01-08
资源大小:279k
文件大小:7k
源码类别:

Shell编程

开发平台:

Visual C++

  1. //
  2. // Written by Bjarke Viksoe (bjarke@viksoe.dk)
  3. // Copyright (c) 2001 Bjarke Viksoe.
  4. //
  5. // This code may be used in compiled form in any way you desire. This
  6. // file may be redistributed by any means PROVIDING it is 
  7. // not sold for profit without the authors written consent, and 
  8. // providing that this notice and the authors name is included. 
  9. //
  10. // This file is provided "as is" with no expressed or implied warranty.
  11. // The author accepts no liability if it causes any damage to you or your
  12. // computer whatsoever. It's free, so don't hassle me about it.
  13. //
  14. // Beware of bugs.
  15. #ifndef __ATLWFILE_H__
  16. #define __ATLWFILE_H__
  17. #ifndef __cplusplus
  18.    #error ATL requires C++ compilation (use a .cpp suffix)
  19. #endif
  20. #ifndef INVALID_SET_FILE_POINTER
  21. #define INVALID_SET_FILE_POINTER ((DWORD)-1)
  22. #endif
  23. #ifndef _ATL_DLL_IMPL
  24. namespace ATL
  25. {
  26. #endif
  27. // Win32 File wrapper class
  28. // Important: Don't make the destructor "virtual" because we need
  29. //            the class v-table to look like the HANDLE type!
  30. class CFile
  31. {
  32. public:
  33.    HANDLE m_hFile;
  34. public:
  35.    CFile() 
  36.    {
  37.       m_hFile = INVALID_HANDLE_VALUE;
  38.    };
  39.    ~CFile()
  40.    { 
  41.       Close(); 
  42.    };
  43.    operator HFILE() const { return (HFILE)m_hFile; };
  44.    operator HANDLE() const { return m_hFile; };
  45.    BOOL Open(LPCTSTR pstrFileName, 
  46.              DWORD dwAccess=GENERIC_READ, 
  47.              DWORD dwShareMode=FILE_SHARE_READ, 
  48.              DWORD dwFlags=OPEN_EXISTING,
  49.              DWORD dwAttributes=FILE_ATTRIBUTE_NORMAL)
  50.    {
  51.       ATLASSERT(!::IsBadStringPtr(pstrFileName,-1));
  52.       Close();
  53.       // Attempt file creation
  54.       HANDLE hFile = ::CreateFile(pstrFileName, 
  55.          dwAccess, 
  56.          dwShareMode, 
  57.          NULL,
  58.          dwFlags, 
  59.          dwAttributes, 
  60.          NULL);
  61.       if( hFile == INVALID_HANDLE_VALUE ) return FALSE;
  62.       m_hFile = hFile;
  63.       return TRUE;
  64.    };
  65.    BOOL Create(LPCTSTR pstrFileName,
  66.                DWORD dwAccess=GENERIC_WRITE, 
  67.                DWORD dwShareMode=0 /*DENY ALL*/, 
  68.                DWORD dwFlags=CREATE_ALWAYS,
  69.                DWORD dwAttributes=FILE_ATTRIBUTE_NORMAL)
  70.    {
  71.       return Open(pstrFileName, dwAccess, dwShareMode, dwFlags, dwAttributes);
  72.    };
  73.    void Close()
  74.    {
  75.       if( m_hFile==INVALID_HANDLE_VALUE ) return;
  76.       ::CloseHandle(m_hFile);
  77.       m_hFile = INVALID_HANDLE_VALUE;
  78.    };
  79.    BOOL IsOpen() const
  80.    {
  81.       return m_hFile!=INVALID_HANDLE_VALUE;
  82.    }
  83.    void Attach(HANDLE hHandle)
  84.    {
  85.       Close();
  86.       m_hFile = hHandle;
  87.    }   
  88.    HANDLE Detach()
  89.    {
  90.       HANDLE h = m_hFile;
  91.       m_hFile = INVALID_HANDLE_VALUE;
  92.       return h;
  93.    }
  94.    BOOL Read(LPVOID lpBuf, DWORD nCount)
  95.    {
  96.       ATLASSERT(m_hFile!=INVALID_HANDLE_VALUE);
  97.       ATLASSERT(lpBuf!=NULL);
  98.       ATLASSERT(!::IsBadWritePtr(lpBuf, nCount));
  99.       if( nCount==0 ) return TRUE;   // avoid Win32 "null-read"
  100.       DWORD dwRead;
  101.       if( !::ReadFile(m_hFile, lpBuf, nCount, &dwRead, NULL) ) return FALSE;
  102.       // Win32s will not return an error all the time (usually DISK_FULL)
  103.       return nCount==dwRead;
  104.    }
  105.    BOOL Read(LPVOID lpBuf, DWORD nCount, LPDWORD pdwRead)
  106.    {
  107.       ATLASSERT(m_hFile!=INVALID_HANDLE_VALUE);
  108.       ATLASSERT(lpBuf);
  109.       ATLASSERT(!::IsBadWritePtr(lpBuf, nCount));
  110.       ATLASSERT(pdwRead);
  111.       *pdwRead = 0;
  112.       if( nCount==0 ) return TRUE;   // avoid Win32 "null-read"
  113.       if( !::ReadFile(m_hFile, lpBuf, nCount, pdwRead, NULL) ) return FALSE;
  114.       // Win32s will not return an error all the time (usually DISK_FULL)
  115.       return nCount==*pdwRead;
  116.    }
  117.    BOOL Write(LPCVOID lpBuf, DWORD nCount)
  118.    {
  119.       ATLASSERT(m_hFile!=INVALID_HANDLE_VALUE);
  120.       ATLASSERT(lpBuf!=NULL);
  121.       ATLASSERT(!::IsBadReadPtr(lpBuf, nCount));   
  122.       if( nCount==0 ) return TRUE; // avoid Win32 "null-write" option
  123.       DWORD dwWritten;
  124.       if( !::WriteFile(m_hFile, lpBuf, nCount, &dwWritten, NULL) ) return FALSE;
  125.       // Win32s will not return an error all the time (usually DISK_FULL)
  126.       return nCount==dwWritten;
  127.    }
  128.    BOOL Write(LPCVOID lpBuf, DWORD nCount, LPDWORD pdwWritten)
  129.    {
  130.       ATLASSERT(m_hFile!=INVALID_HANDLE_VALUE);
  131.       ATLASSERT(lpBuf);
  132.       ATLASSERT(!::IsBadReadPtr(lpBuf, nCount));
  133.       ATLASSERT(pdwWritten);    
  134.       *pdwWritten = 0;
  135.       if( nCount==0 ) return TRUE; // avoid Win32 "null-write" option
  136.       if( !::WriteFile(m_hFile, lpBuf, nCount, pdwWritten, NULL) ) return FALSE;
  137.       // Win32s will not return an error all the time (usually DISK_FULL)
  138.       return nCount==*pdwWritten;
  139.    }
  140.    DWORD Seek(LONG lOff, UINT nFrom)
  141.    {
  142.       ATLASSERT(m_hFile!=INVALID_HANDLE_VALUE);
  143.       DWORD dwNew = ::SetFilePointer(m_hFile, lOff, NULL, (DWORD)nFrom);
  144.       if( dwNew==INVALID_SET_FILE_POINTER ) return (DWORD)-1;
  145.       return dwNew;
  146.    }
  147.    DWORD GetPosition() const
  148.    {
  149.       ATLASSERT(m_hFile!=INVALID_HANDLE_VALUE);
  150.       DWORD dwPos = ::SetFilePointer(m_hFile, 0, NULL, FILE_CURRENT);
  151.       if( dwPos == INVALID_SET_FILE_POINTER ) return (DWORD)-1;
  152.       return dwPos;
  153.    }
  154.    BOOL Flush()
  155.    {
  156.       ATLASSERT(m_hFile!=INVALID_HANDLE_VALUE);
  157.       if( m_hFile==INVALID_HANDLE_VALUE ) return FALSE;
  158.       if( ::FlushFileBuffers(m_hFile)==0 ) return FALSE;
  159.       return TRUE;
  160.    }
  161.    DWORD GetSize() const
  162.    {
  163.       ATLASSERT(m_hFile!=INVALID_HANDLE_VALUE);
  164.       return ::GetFileSize(m_hFile, NULL);
  165.    }
  166.    DWORD GetType() const
  167.    {
  168.       ATLASSERT(m_hFile!=INVALID_HANDLE_VALUE);
  169.       return ::GetFileType(m_hFile);
  170.    }
  171.    BOOL GetFileTime(FILETIME *ftCreate, FILETIME *ftAccess, FILETIME *ftModified)
  172.    {
  173.       ATLASSERT(m_hFile!=INVALID_HANDLE_VALUE);
  174.       return ::GetFileTime(m_hFile, ftCreate, ftAccess, ftModified);
  175.    }
  176.    static BOOL FileExists(LPCTSTR pstrFileName)
  177.    {
  178.       ATLASSERT(!::IsBadStringPtr(pstrFileName, MAX_PATH));
  179.       return ::GetFileAttributes(pstrFileName)!=0xFFFFFFFF;
  180.    };
  181.    static BOOL Delete(LPCTSTR pstrFileName)
  182.    {
  183.       ATLASSERT(!::IsBadStringPtr(pstrFileName, MAX_PATH));
  184.       return ::DeleteFile(pstrFileName);
  185.    };
  186.    static BOOL Rename(LPCTSTR pstrSourceFileName, LPCTSTR pstrTargetFileName)
  187.    {
  188.       ATLASSERT(!::IsBadStringPtr(pstrSourceFileName, MAX_PATH));
  189.       ATLASSERT(!::IsBadStringPtr(pstrTargetFileName, MAX_PATH));
  190.       return ::MoveFile(pstrSourceFileName, pstrTargetFileName);
  191.    };
  192. };
  193. class CTemporaryFile : public CFile
  194. {
  195. public:
  196.    TCHAR m_szFileName[MAX_PATH];
  197. public:
  198.    ~CTemporaryFile()
  199.    { 
  200.       Close();
  201.       Delete(m_szFileName);
  202.    };
  203.    BOOL Create(LPTSTR pstrFileName, UINT cchFilename,
  204.                DWORD dwAccess=GENERIC_WRITE, 
  205.                DWORD dwShareMode=0 /*DENY ALL*/, 
  206.                DWORD dwFlags=CREATE_ALWAYS,
  207.                DWORD dwAttributes=FILE_ATTRIBUTE_NORMAL)
  208.    {
  209.       ATLASSERT(!::IsBadStringPtr(pstrFileName, cchFilename));
  210.       if( cchFilename>0 ) {
  211.          ::GetTempPath(cchFilename, pstrFileName);
  212.          ::GetTempFileName(pstrFileName, _T("BV"), 0, pstrFileName);
  213.       }
  214.       ::lstrcpy(m_szFileName, pstrFileName);
  215.       return Open(pstrFileName, dwAccess, dwShareMode, dwFlags, dwAttributes);
  216.    };
  217. };
  218. #ifndef _ATL_DLL_IMPL
  219. }; //namespace ATL
  220. #endif
  221. #endif // __ATLWFILE_H___