FileIO.h revision baa3858d3f5d128a5c8466b700098109edcad5f2
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
10namespace NWindows {
11namespace NFile {
12namespace NIO {
13
14struct 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
26class CFileBase
27{
28protected:
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
38public:
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
65class 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
99public:
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
113class COutFile: public CFileBase
114{
115public:
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