Home | History | Annotate | Download | only in Windows
      1 // Windows/FileIO.h
      2 
      3 #ifndef __WINDOWS_FILEIO_H
      4 #define __WINDOWS_FILEIO_H
      5 
      6 #include "../Common/Types.h"
      7 
      8 #include "Defs.h"
      9 
     10 namespace NWindows {
     11 namespace NFile {
     12 namespace NIO {
     13 
     14 struct CByHandleFileInfo
     15 {
     16   DWORD Attrib;
     17   FILETIME CTime;
     18   FILETIME ATime;
     19   FILETIME MTime;
     20   DWORD VolumeSerialNumber;
     21   UInt64 Size;
     22   DWORD NumberOfLinks;
     23   UInt64 FileIndex;
     24 };
     25 
     26 class CFileBase
     27 {
     28 protected:
     29   HANDLE _handle;
     30 
     31   bool Create(LPCTSTR fileName, DWORD desiredAccess,
     32       DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
     33   #ifndef _UNICODE
     34   bool Create(LPCWSTR fileName, DWORD desiredAccess,
     35       DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
     36   #endif
     37 
     38 public:
     39   #ifdef SUPPORT_DEVICE_FILE
     40   bool IsDeviceFile;
     41   bool LengthDefined;
     42   UInt64 Length;
     43   #endif
     44 
     45   CFileBase(): _handle(INVALID_HANDLE_VALUE) {};
     46   ~CFileBase();
     47 
     48   bool Close();
     49 
     50   bool GetPosition(UInt64 &position) const;
     51   bool GetLength(UInt64 &length) const;
     52 
     53   bool Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const;
     54   bool Seek(UInt64 position, UInt64 &newPosition);
     55   bool SeekToBegin();
     56   bool SeekToEnd(UInt64 &newPosition);
     57 
     58   bool GetFileInformation(CByHandleFileInfo &fileInfo) const;
     59 };
     60 
     61 #define IOCTL_CDROM_BASE  FILE_DEVICE_CD_ROM
     62 #define IOCTL_CDROM_GET_DRIVE_GEOMETRY  CTL_CODE(IOCTL_CDROM_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS)
     63 #define IOCTL_CDROM_MEDIA_REMOVAL  CTL_CODE(IOCTL_CDROM_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
     64 
     65 class CInFile: public CFileBase
     66 {
     67   #ifdef SUPPORT_DEVICE_FILE
     68   bool DeviceIoControl(DWORD controlCode, LPVOID inBuffer, DWORD inSize,
     69       LPVOID outBuffer, DWORD outSize, LPDWORD bytesReturned, LPOVERLAPPED overlapped) const
     70   {
     71     return BOOLToBool(::DeviceIoControl(_handle, controlCode, inBuffer, inSize,
     72         outBuffer, outSize, bytesReturned, overlapped));
     73   }
     74 
     75   bool DeviceIoControl(DWORD controlCode, LPVOID inBuffer,
     76       DWORD inSize, LPVOID outBuffer, DWORD outSize) const
     77   {
     78     DWORD ret;
     79     return DeviceIoControl(controlCode, inBuffer, inSize, outBuffer, outSize, &ret, 0);
     80   }
     81 
     82   bool DeviceIoControlOut(DWORD controlCode, LPVOID outBuffer, DWORD outSize) const
     83     { return DeviceIoControl(controlCode, NULL, 0, outBuffer, outSize); }
     84 
     85   #ifndef UNDER_CE
     86   bool GetGeometry(DISK_GEOMETRY *res) const
     87     { return DeviceIoControlOut(IOCTL_DISK_GET_DRIVE_GEOMETRY, res, sizeof(*res)); }
     88 
     89   bool GetCdRomGeometry(DISK_GEOMETRY *res) const
     90     { return DeviceIoControlOut(IOCTL_CDROM_GET_DRIVE_GEOMETRY, res, sizeof(*res)); }
     91 
     92   bool GetPartitionInfo(PARTITION_INFORMATION *res)
     93     { return DeviceIoControlOut(IOCTL_DISK_GET_PARTITION_INFO, LPVOID(res), sizeof(*res)); }
     94   #endif
     95 
     96   void GetDeviceLength();
     97   #endif
     98 
     99 public:
    100   bool Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
    101   bool OpenShared(LPCTSTR fileName, bool shareForWrite);
    102   bool Open(LPCTSTR fileName);
    103   #ifndef _UNICODE
    104   bool Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
    105   bool OpenShared(LPCWSTR fileName, bool shareForWrite);
    106   bool Open(LPCWSTR fileName);
    107   #endif
    108   bool Read1(void *data, UInt32 size, UInt32 &processedSize);
    109   bool ReadPart(void *data, UInt32 size, UInt32 &processedSize);
    110   bool Read(void *data, UInt32 size, UInt32 &processedSize);
    111 };
    112 
    113 class COutFile: public CFileBase
    114 {
    115 public:
    116   bool Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
    117   bool Open(LPCTSTR fileName, DWORD creationDisposition);
    118   bool Create(LPCTSTR fileName, bool createAlways);
    119 
    120   #ifndef _UNICODE
    121   bool Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes);
    122   bool Open(LPCWSTR fileName, DWORD creationDisposition);
    123   bool Create(LPCWSTR fileName, bool createAlways);
    124   #endif
    125 
    126   bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime);
    127   bool SetMTime(const FILETIME *mTime);
    128   bool WritePart(const void *data, UInt32 size, UInt32 &processedSize);
    129   bool Write(const void *data, UInt32 size, UInt32 &processedSize);
    130   bool SetEndOfFile();
    131   bool SetLength(UInt64 length);
    132 };
    133 
    134 }}}
    135 
    136 #endif
    137