source: trunk/UFileStreamEx.pas

Last change on this file was 37, checked in by chronos, 7 years ago
  • Fixed: Wrong color in About form.
  • Fixed: Range check error in registry HKEY assignment.
  • Added: Windows 32-bit and 64-bit build profiles.
File size: 5.7 KB
Line 
1unit UFileStreamEx;
2
3{$mode delphi}
4
5interface
6
7uses
8 Classes, SysUtils;
9
10type
11 { THandleStreamEx }
12
13 THandleStreamEx = class(TStream)
14 private
15 FHandle: THandle;
16 protected
17 procedure SetSize(NewSize: Longint); override;
18 procedure SetSize(const NewSize: Int64); override;
19 public
20 constructor Create(AHandle: THandle);
21 function Read(var Buffer; Count: Longint): Longint; override;
22 function Write(const Buffer; Count: Longint): Longint; override;
23 function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
24 property Handle: THandle read FHandle;
25 end;
26
27 TFileFlag = (ffDirect, ffSync);
28 TFileFlags = set of TFileFlag;
29
30 { TFileStreamEx }
31
32 TFileStreamEx = class(THandleStreamEx)
33 Private
34 FFileName : String;
35 public
36 constructor Create(const AFileName: string; Mode: Word; Flags: TFileFlags); overload;
37 constructor Create(const AFileName: string; Mode: Word; Rights: Cardinal; Flags: TFileFlags); overload;
38 destructor Destroy; override;
39 property FileName : String Read FFilename;
40 end;
41
42
43implementation
44
45uses
46 RtlConsts{$IFDEF Linux}, BaseUnix{$ENDIF};
47
48const
49{ File access modes for `open' and `fcntl'. }
50O_RDONLY = 0; { Open read-only. }
51O_WRONLY = 1; { Open write-only. }
52O_RDWR = 2; { Open read/write. }
53O_CREAT = $40;
54O_EXCL = $80;
55O_NOCTTY = $100;
56O_TRUNC = $200;
57O_APPEND = $400;
58O_NONBLOCK = $800;
59O_NDELAY = O_NONBLOCK;
60O_SYNC = $1000;
61O_DIRECT = $4000;
62O_DIRECTORY = $10000;
63O_NOFOLLOW = $20000;
64
65
66function FileOpenEx(const FileName: RawbyteString; Mode: Integer; Flags: TFileFlags): Longint;
67var
68 SystemFileName: RawByteString;
69 LinuxFlags: Longint;
70begin
71 {$IFDEF Linux}
72 LinuxFlags := 0;
73 case (Mode and (fmOpenRead or fmOpenWrite or fmOpenReadWrite)) of
74 fmOpenRead: LinuxFlags := LinuxFlags or O_RDONLY;
75 fmOpenWrite: LinuxFlags := LinuxFlags or O_WRONLY;
76 fmOpenReadWrite: LinuxFlags := LinuxFlags or O_RDWR;
77 end;
78 if ffDirect in Flags then LinuxFlags := LinuxFlags or O_DIRECT;
79 if ffSync in Flags then LinuxFlags := LinuxFlags or O_SYNC;
80
81 SystemFileName := ToSingleByteFileSystemEncodedFileName(FileName);
82 repeat
83 Result := fpOpen(Pointer(SystemFileName), LinuxFlags);
84 until (Result <> -1) or (fpgeterrno <> ESysEINTR);
85
86 //Result := DoFileLocking(Result, Mode);
87 {$ENDIF}
88end;
89
90function FileCreateEx(const FileName: RawByteString; Flags: TFileFlags): Longint; overload;
91var
92 SystemFileName: RawByteString;
93 LinuxFlags: Longint;
94begin
95 {$IFDEF Linux}
96 LinuxFlags := O_RDWR or O_CREAT or O_TRUNC;
97 if ffDirect in Flags then LinuxFlags := LinuxFlags or O_DIRECT;
98 if ffSync in Flags then LinuxFlags := LinuxFlags or O_SYNC;
99 SystemFileName := ToSingleByteFileSystemEncodedFileName(FileName);
100 repeat
101 Result := fpOpen(pointer(SystemFileName), LinuxFlags);
102 until (Result <> -1) or (fpgeterrno <> ESysEINTR);
103 {$ENDIF}
104end;
105
106function FileCreateEx(const FileName: RawByteString; Rights: Longint; Flags: TFileFlags): Longint; overload;
107var
108 SystemFileName: RawByteString;
109 LinuxFlags: Longint;
110begin
111 {$IFDEF Linux}
112 LinuxFlags := O_RDWR or O_CREAT or O_TRUNC;
113 if ffDirect in Flags then LinuxFlags := LinuxFlags or O_DIRECT;
114 if ffSync in Flags then LinuxFlags := LinuxFlags or O_SYNC;
115 SystemFileName := ToSingleByteFileSystemEncodedFileName(FileName);
116 repeat
117 Result := fpOpen(pointer(SystemFileName), LinuxFlags, Rights);
118 until (Result <> -1) or (fpgeterrno <> ESysEINTR);
119 {$ENDIF}
120end;
121
122function FileCreateEx(const FileName: RawByteString; ShareMode: Longint; Rights: LongInt; Flags: TFileFlags): Longint; overload;
123begin
124 Result := FileCreateEx(FileName, Rights, Flags);
125 //Result := DoFileLocking(Result, ShareMode);
126end;
127
128function FileReadEx(Handle: Longint; out Buffer; Count: Longint): Longint;
129begin
130 {$IFDEF Linux}
131 repeat
132 Result := fpRead(Handle, Buffer, Count);
133 until (Result <> -1) or (fpgeterrno <> ESysEINTR);
134 {$ENDIF}
135end;
136
137function FileWriteEx(Handle: Longint; const Buffer; Count: Longint): Longint;
138begin
139 {$IFDEF Linux}
140 repeat
141 Result := fpWrite(Handle, Buffer, Count);
142 until (Result <> -1) or (fpgeterrno <> ESysEINTR);
143 {$ENDIF}
144end;
145
146
147
148
149{ THandleStreamEx }
150
151constructor THandleStreamEx.Create(AHandle: THandle);
152begin
153 inherited Create;
154 FHandle := AHandle;
155end;
156
157function THandleStreamEx.Read(var Buffer; Count: Longint): Longint;
158begin
159 Result := FileReadEx(FHandle, Buffer, Count);
160 if Result = -1 then Result := 0;
161end;
162
163function THandleStreamEx.Write(const Buffer; Count: Longint): Longint;
164begin
165 Result := FileWriteEx(FHandle, Buffer, Count);
166 if Result = -1 then Result := 0;
167end;
168
169procedure THandleStreamEx.SetSize(NewSize: Longint);
170begin
171 SetSize(Int64(NewSize));
172end;
173
174procedure THandleStreamEx.SetSize(const NewSize: Int64);
175begin
176 FileTruncate(FHandle, NewSize);
177end;
178
179function THandleStreamEx.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
180begin
181 Result := FileSeek(FHandle, Offset, Ord(Origin));
182end;
183
184{ TFileStreamEx }
185
186constructor TFileStreamEx.Create(const AFileName: string; Mode: Word; Flags: TFileFlags);
187begin
188 Create(AFileName, Mode, 438, Flags);
189end;
190
191constructor TFileStreamEx.Create(const AFileName: string; Mode: Word; Rights: Cardinal; Flags: TFileFlags);
192begin
193 FFileName := AFileName;
194 if (Mode and fmCreate) > 0 then
195 FHandle := FileCreateEx(AFileName, Mode, Rights, Flags)
196 else
197 FHandle := FileOpenEx(AFileName, Mode, Flags);
198
199 if THandle(FHandle) = feInvalidHandle then
200 if Mode = fmcreate then
201 raise EFCreateError.createfmt(SFCreateError,[AFileName])
202 else
203 raise EFOpenError.Createfmt(SFOpenError,[AFilename]);
204end;
205
206destructor TFileStreamEx.Destroy;
207begin
208 FileClose(FHandle);
209end;
210
211
212end.
213
Note: See TracBrowser for help on using the repository browser.