2 * CopyFile, MoveFile and related routines test
14 DWORD drives
= GetLogicalDrives();
17 TCHAR rootdir
[] = _T( "?:\\" );
18 TCHAR currentdir
[MAX_PATH
+ 1];
20 if (0 != GetCurrentDirectory(MAX_PATH
+ 1, currentdir
)) {
21 for (drive
= _T('A'); ! found
&& drive
<= _T('Z'); drive
++) {
22 if (0 != (drives
& (1 << (drive
- _T('A'))))&&
23 drive
!= _totupper(currentdir
[0])) {
25 found
= (DRIVE_FIXED
== GetDriveType(rootdir
));
30 return found
? drive
- 1 : _T( ' ' );
34 DeleteTestFile(LPCTSTR filename
)
36 SetFileAttributes(filename
, FILE_ATTRIBUTE_NORMAL
);
41 CreateTestFile(LPCTSTR filename
, DWORD attributes
)
48 DeleteTestFile(filename
);
49 file
= CreateFile(filename
,
50 GENERIC_READ
| GENERIC_WRITE
,
57 if (INVALID_HANDLE_VALUE
== file
) {
58 fprintf(stderr
, "CreateFile failed with code %lu\n", GetLastError());
61 for(c
= 0; c
< sizeof(buffer
); c
++) {
64 if (! WriteFile(file
, buffer
, sizeof(buffer
), &wrote
, NULL
)) {
65 fprintf(stderr
, "WriteFile failed with code %lu\n", GetLastError());
70 if (! SetFileAttributes(filename
, attributes
)) {
71 fprintf(stderr
, "SetFileAttributes failed with code %lu\n", GetLastError());
77 DeleteTestDir(LPCTSTR dirname
)
79 RemoveDirectory(dirname
);
83 CreateTestDir(LPCTSTR dirname
)
85 if (! CreateDirectory(dirname
, NULL
)) {
86 fprintf(stderr
, "CreateDirectory failed with code %lu\n", GetLastError());
92 CheckTestFile(LPCTSTR filename
, DWORD attributes
)
100 file
= CreateFile(filename
,
108 if (INVALID_HANDLE_VALUE
== file
) {
109 fprintf(stderr
, "CreateFile failed with code %lu\n", GetLastError());
113 if (! ReadFile(file
, buffer
, sizeof(buffer
), &read
, NULL
)) {
114 fprintf(stderr
, "ReadFile failed with code %lu\n", GetLastError());
117 if (read
!= sizeof(buffer
)) {
118 fprintf(stderr
, "Trying to read %u bytes but got %lu bytes\n", sizeof(buffer
), read
);
121 for(c
= 0; c
< sizeof(buffer
); c
++) {
122 if (buffer
[c
] != (char) c
) {
123 fprintf(stderr
, "File contents changed at position %u\n", c
);
130 diskattr
= GetFileAttributes(filename
);
131 if (INVALID_FILE_ATTRIBUTES
== diskattr
) {
132 fprintf(stderr
, "GetFileAttributes failed with code %lu\n", GetLastError());
135 if (diskattr
!= attributes
) {
136 fprintf(stderr
, "Attribute mismatch, expected 0x%08lx found 0x%08lx\n", attributes
, diskattr
);
142 main(int argc
, char *argv
[])
145 TCHAR otherfile
[ ] = _T("?:\\other.dat");
147 otherdrive
= FindOtherDrive();
149 printf("Testing simple move\n");
150 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE
);
151 DeleteTestFile(_T("end.dat"));
152 if (! MoveFile(_T("begin.dat"), _T("end.dat"))) {
153 fprintf(stderr
, "MoveFile failed with code %lu\n", GetLastError());
156 CheckTestFile(_T("end.dat"), FILE_ATTRIBUTE_ARCHIVE
);
157 DeleteTestFile(_T("end.dat"));
159 printf("Testing move of non-existing file\n");
160 DeleteTestFile(_T("begin.dat"));
161 DeleteTestFile(_T("end.dat"));
162 if (MoveFile(_T("begin.dat"), _T("end.dat"))) {
163 fprintf(stderr
, "MoveFile succeeded but shouldn't have\n");
165 } else if (ERROR_FILE_NOT_FOUND
!= GetLastError()) {
166 fprintf(stderr
, "MoveFile failed with unexpected code %lu\n", GetLastError());
169 DeleteTestFile(_T("end.dat"));
171 /* Not correctly implemented in ros, destination file is kept open after this */
173 printf("Testing move to existing file\n");
174 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE
);
175 CreateTestFile(_T("end.dat"), FILE_ATTRIBUTE_ARCHIVE
);
176 if (MoveFile(_T("begin.dat"), _T("end.dat"))) {
177 fprintf(stderr
, "MoveFile succeeded but shouldn't have\n");
179 } else if (ERROR_ALREADY_EXISTS
!= GetLastError()) {
180 fprintf(stderr
, "MoveFile failed with unexpected code %lu\n", GetLastError());
183 DeleteTestFile(_T("begin.dat"));
184 DeleteTestFile(_T("end.dat"));
187 /* Not implemented yet in ros */
189 printf("Testing directory move\n");
190 CreateTestDir(_T("begin"));
191 CreateTestFile(_T("begin\\file.dat"), FILE_ATTRIBUTE_NORMAL
);
192 DeleteTestDir(_T("end"));
193 if (! MoveFile(_T("begin"), _T("end"))) {
194 fprintf(stderr
, "MoveFile failed with code %lu\n", GetLastError());
197 CheckTestFile(_T("end\\file.dat"), FILE_ATTRIBUTE_NORMAL
);
198 DeleteTestFile(_T("end\\file.dat"));
199 DeleteTestDir(_T("end"));
202 printf("Testing file move to different directory\n");
203 CreateTestFile(_T("file.dat"), FILE_ATTRIBUTE_NORMAL
);
204 CreateTestDir(_T("end"));
205 if (! MoveFile(_T("file.dat"), _T("end\\file.dat"))) {
206 fprintf(stderr
, "MoveFile failed with code %lu\n", GetLastError());
209 CheckTestFile(_T("end\\file.dat"), FILE_ATTRIBUTE_ARCHIVE
);
210 DeleteTestFile(_T("end\\file.dat"));
211 DeleteTestDir(_T("end"));
213 printf("Testing move of read-only file\n");
214 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_READONLY
);
215 DeleteTestFile(_T("end.dat"));
216 if (! MoveFile(_T("begin.dat"), _T("end.dat"))) {
217 fprintf(stderr
, "MoveFile failed with code %lu\n", GetLastError());
220 CheckTestFile(_T("end.dat"), FILE_ATTRIBUTE_ARCHIVE
| FILE_ATTRIBUTE_READONLY
);
221 DeleteTestFile(_T("end.dat"));
223 printf("Testing move to different drive\n");
224 if (_T(' ') != otherdrive
) {
225 otherfile
[0] = otherdrive
;
226 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE
);
227 DeleteTestFile(otherfile
);
228 if (! MoveFile(_T("begin.dat"), otherfile
)) {
229 fprintf(stderr
, "MoveFile failed with code %lu\n", GetLastError());
232 CheckTestFile(otherfile
, FILE_ATTRIBUTE_ARCHIVE
);
233 DeleteTestFile(otherfile
);
235 printf(" Test skipped, no other drive available\n");
238 printf("Testing move/overwrite of existing file\n");
239 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE
);
240 CreateTestFile(_T("end.dat"), FILE_ATTRIBUTE_ARCHIVE
);
241 if (! MoveFileEx(_T("begin.dat"), _T("end.dat"), MOVEFILE_REPLACE_EXISTING
)) {
242 fprintf(stderr
, "MoveFileEx failed with code %lu\n", GetLastError());
245 DeleteTestFile(_T("begin.dat"));
246 DeleteTestFile(_T("end.dat"));
248 /* Not (correctly) implemented in ros yet */
250 printf("Testing move/overwrite of existing readonly file\n");
251 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE
);
252 CreateTestFile(_T("end.dat"), FILE_ATTRIBUTE_READONLY
);
253 if (MoveFileEx(_T("begin.dat"), _T("end.dat"), MOVEFILE_REPLACE_EXISTING
)) {
254 fprintf(stderr
, "MoveFileEx succeeded but shouldn't have\n");
256 } else if (ERROR_ALREADY_EXISTS
!= GetLastError() &&
257 ERROR_ACCESS_DENIED
!= GetLastError()) {
258 fprintf(stderr
, "MoveFileEx failed with unexpected code %lu\n", GetLastError());
261 DeleteTestFile(_T("begin.dat"));
262 DeleteTestFile(_T("end.dat"));
265 /* Not implemented in ros yet */
267 printf("Testing move to different drive without COPY_ALLOWED\n");
268 if (_T(' ') != otherdrive
) {
269 otherfile
[0] = otherdrive
;
270 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE
);
271 DeleteTestFile(otherfile
);
272 if (MoveFileEx(_T("begin.dat"), otherfile
, 0)) {
273 fprintf(stderr
, "MoveFileEx succeeded but shouldn't have\n");
275 } else if (ERROR_NOT_SAME_DEVICE
!= GetLastError()) {
276 fprintf(stderr
, "MoveFileEx failed with unexpected code %lu\n", GetLastError());
279 DeleteTestFile(otherfile
);
281 printf(" Test skipped, no other drive available\n");
285 printf("Testing move to different drive with COPY_ALLOWED\n");
286 if (_T(' ') != otherdrive
) {
287 otherfile
[0] = otherdrive
;
288 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE
);
289 DeleteTestFile(otherfile
);
290 if (! MoveFileEx(_T("begin.dat"), otherfile
, MOVEFILE_COPY_ALLOWED
)) {
291 fprintf(stderr
, "MoveFileEx failed with code %lu\n", GetLastError());
294 CheckTestFile(otherfile
, FILE_ATTRIBUTE_ARCHIVE
);
295 DeleteTestFile(otherfile
);
297 printf(" Test skipped, no other drive available\n");
300 printf("All tests successfully completed\n");