annotate dmd/File.d @ 0:10317f0c89a5

Initial commit
author korDen
date Sat, 24 Oct 2009 08:42:06 +0400
parents
children 7427ded8caf7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.File;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3 import dmd.FileName;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Array;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import core.stdc.stdlib;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import core.sys.windows.windows;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import std.string : toStringz;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 class File
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 int ref_; // != 0 if this is a reference to someone else's buffer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 ubyte* buffer; // data for our file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 uint len; // amount of data in buffer[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 void* touchtime; // system time to use for file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 FileName name; // name of our file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 this(string n)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 name = new FileName(n);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 this(FileName n)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 name = n;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 ~this()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 if (buffer !is null) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 if (ref_ == 0) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 free(buffer);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 version (_WIN32) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 if (ref_ == 2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 UnmapViewOfFile(buffer);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 if (touchtime !is null) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 free(touchtime);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 void mark()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 ///mem.mark(buffer);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 ///mem.mark(touchtime);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 ///mem.mark(name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57 string toChars()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 return name.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62 /* Read file, return !=0 if error
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 int read()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 version (POSIX) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 int result = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 string name = this.name.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 //printf("File::read('%s')\n",name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 int fd = open(name, O_RDONLY);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 if (fd == -1) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 result = errno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 //printf("\topen error, errno = %d\n", errno);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 goto err1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 if (ref_ == 0) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 free(buffer);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 ref_ = 0; // we own the buffer now
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 //printf("\tfile opened\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 stat buf;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 if (fstat(fd, &buf)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 printf("\tfstat error, errno = %d\n", errno);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 off_t size = buf.st_size;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 buffer = cast(ubyte*)malloc(size + 2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 if (buffer is null) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 printf("\tmalloc error, errno = %d\n", errno);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 ssize_t numread = .read(fd, buffer, size);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 if (numread != size) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 printf("\tread error, errno = %d\n",errno);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 if (touchtime !is null) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 memcpy(touchtime, &buf, buf.sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 if (close(fd) == -1) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 printf("\tclose error, errno = %d\n",errno);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 goto err;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 len = size;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 // Always store a wchar ^Z past end of buffer so scanner has a sentinel
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 buffer[size] = 0; // ^Z is obsolete, use 0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 buffer[size + 1] = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 err2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 close(fd);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 err:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 free(buffer);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 buffer = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 len = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 err1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 result = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 return result;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 } else version (_WIN32) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 DWORD size;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 DWORD numread;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 HANDLE h;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 int result = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 string name = this.name.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 //std.stdio.writeln("Open file ", name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 h = CreateFileA(toStringz(name), GENERIC_READ, FILE_SHARE_READ, null, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, HANDLE.init);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 if (h == INVALID_HANDLE_VALUE) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 goto err1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 if (!ref_) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 free(buffer);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 ref_ = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 size = GetFileSize(h, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 buffer = cast(ubyte*) malloc(size + 2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 if (!buffer)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 if (ReadFile(h, buffer, size, &numread, null) != TRUE)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 if (numread != size)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 if (touchtime) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 if (!GetFileTime(h, null, null, &(cast(WIN32_FIND_DATA*)touchtime).ftLastWriteTime))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 if (!CloseHandle(h))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 goto err;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 len = size;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 // Always store a wchar ^Z past end of buffer so scanner has a sentinel
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 buffer[size] = 0; // ^Z is obsolete, use 0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 buffer[size + 1] = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 err2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 CloseHandle(h);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 err:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 free(buffer);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 buffer = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 len = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 err1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 result = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 return result;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 static assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 /* Write file, either succeed or fail
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 * with error message & exit.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 void readv()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 if (read())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 error("Error reading file '%s'\n",name.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 /* Read file, return !=0 if error
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 int mmread()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212 /* Write file, either succeed or fail
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 * with error message & exit.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 void mmreadv()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 /* Write file, return !=0 if error
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 /*********************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 * Write a file.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 * Returns:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227 * 0 success
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 int write()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 version (POSIX) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233 /+
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 int fd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 ssize_t numwritten;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 char *name;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 name = this->name->toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 fd = open(name, O_CREAT | O_WRONLY | O_TRUNC, 0644);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 if (fd == -1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 goto err;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 numwritten = ::write(fd, buffer, len);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 if (len != numwritten)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 if (close(fd) == -1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248 goto err;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250 if (touchtime)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251 { struct utimbuf ubuf;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253 ubuf.actime = ((struct stat *)touchtime)->st_atime;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 ubuf.modtime = ((struct stat *)touchtime)->st_mtime;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 if (utime(name, &ubuf))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 goto err;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 err2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 close(fd);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262 ::remove(name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 err:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 return 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 +/
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 } else version (_WIN32) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 HANDLE h;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 DWORD numwritten;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 const(char)* name = toStringz(this.name.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 h = CreateFileA(name, GENERIC_WRITE, 0, null, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 if (h == INVALID_HANDLE_VALUE)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 goto err;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 if (WriteFile(h, buffer, len, &numwritten, null) != TRUE)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278 if (len != numwritten)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 if (touchtime) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 SetFileTime(h, null, null, &(cast(WIN32_FIND_DATA*)touchtime).ftLastWriteTime);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 if (!CloseHandle(h))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 goto err;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 err2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289 CloseHandle(h);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290 DeleteFileA(name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 err:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 return 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 static assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 /* Write file, either succeed or fail
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299 * with error message & exit.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302 void writev()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304 if (write()) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 error("Error writing file '%s'\n", name.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
308
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309 /* Return !=0 if file exists.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
310 * 0: file doesn't exist
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311 * 1: normal file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 * 2: directory
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
313 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315 /* Append to file, return !=0 if error
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
316 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 int append()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323 /* Append to file, either succeed or fail
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
324 * with error message & exit.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
326
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
327 void appendv()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
329 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332 /* Return !=0 if file exists.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333 * 0: file doesn't exist
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334 * 1: normal file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
335 * 2: directory
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338 int exists()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343 /* Given wildcard filespec, return an array of
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344 * matching File's.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
347 static Array match(char*)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
348 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
349 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
351
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
352 static Array match(FileName *)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
353 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
355 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357 // Compare file times.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358 // Return <0 this < f
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 // =0 this == f
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360 // >0 this > f
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361 int compareTime(File f)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 // Read system file statistics
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367 void stat()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
371
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
372 /* Set buffer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375 void setbuffer(void* buffer, uint len)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
376 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377 this.buffer = cast(ubyte*)buffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
378 this.len = len;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
379 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
380
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
381 void checkoffset(size_t offset, size_t nbytes)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
383 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
385
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
386 void remove() // delete file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
387 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
388 version (POSIX) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
389 .remove(this.name.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
390 } else version (_WIN32) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
391 DeleteFileA(toStringz(this.name.toChars()));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
392 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
393 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
394 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
395 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
396 }