2 * CopyFile, MoveFile and related routines test
13 DWORD drives = GetLogicalDrives();
16 TCHAR rootdir[] = _T( "?:\\" );
17 TCHAR currentdir[MAX_PATH + 1];
19 if (0 != GetCurrentDirectory(MAX_PATH + 1, currentdir)) {
20 for (drive = _T('A'); ! found && drive <= _T('Z'); drive++) {
21 if (0 != (drives & (1 << (drive - _T('A'))))&&
22 drive != _totupper(currentdir[0])) {
24 found = (DRIVE_FIXED == GetDriveType(rootdir));
29 return found ? drive - 1 : _T( ' ' );
33 DeleteTestFile(LPCTSTR filename)
35 SetFileAttributes(filename, FILE_ATTRIBUTE_NORMAL);
40 CreateTestFile(LPCTSTR filename, DWORD attributes)
47 DeleteTestFile(filename);
48 file = CreateFile(filename,
49 GENERIC_READ | GENERIC_WRITE,
56 if (INVALID_HANDLE_VALUE == file) {
57 fprintf(stderr, "CreateFile failed with code %d\n", GetLastError());
60 for(c = 0; c < sizeof(buffer); c++) {
63 if (! WriteFile(file, buffer, sizeof(buffer), &wrote, NULL)) {
64 fprintf(stderr, "WriteFile failed with code %d\n", GetLastError());
69 if (! SetFileAttributes(filename, attributes)) {
70 fprintf(stderr, "SetFileAttributes failed with code %d\n", GetLastError());
76 DeleteTestDir(LPCTSTR dirname)
78 RemoveDirectory(dirname);
82 CreateTestDir(LPCTSTR dirname)
84 if (! CreateDirectory(dirname, NULL)) {
85 fprintf(stderr, "CreateDirectory failed with code %d\n", GetLastError());
91 CheckTestFile(LPCTSTR filename, DWORD attributes)
99 file = CreateFile(filename,
107 if (INVALID_HANDLE_VALUE == file) {
108 fprintf(stderr, "CreateFile failed with code %d\n", GetLastError());
112 if (! ReadFile(file, buffer, sizeof(buffer), &read, NULL)) {
113 fprintf(stderr, "ReadFile failed with code %d\n", GetLastError());
116 if (read != sizeof(buffer)) {
117 fprintf(stderr, "Trying to read %d bytes but got %d bytes\n", sizeof(buffer), read);
120 for(c = 0; c < sizeof(buffer); c++) {
121 if (buffer[c] != (char) c) {
122 fprintf(stderr, "File contents changed at position %d\n", c);
129 diskattr = GetFileAttributes(filename);
130 if (INVALID_FILE_ATTRIBUTES == diskattr) {
131 fprintf(stderr, "GetFileAttributes failed with code %d\n", GetLastError());
134 if (diskattr != attributes) {
135 fprintf(stderr, "Attribute mismatch, expected 0x%08x found 0x%08x\n", attributes, diskattr);
141 main(int argc, char *argv[])
144 TCHAR otherfile[ ] = _T("?:\\other.dat");
146 otherdrive = FindOtherDrive();
148 printf("Testing simple move\n");
149 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE);
150 DeleteTestFile(_T("end.dat"));
151 if (! MoveFile(_T("begin.dat"), _T("end.dat"))) {
152 fprintf(stderr, "MoveFile failed with code %d\n", GetLastError());
155 CheckTestFile(_T("end.dat"), FILE_ATTRIBUTE_ARCHIVE);
156 DeleteTestFile(_T("end.dat"));
158 printf("Testing move of non-existing file\n");
159 DeleteTestFile(_T("begin.dat"));
160 DeleteTestFile(_T("end.dat"));
161 if (MoveFile(_T("begin.dat"), _T("end.dat"))) {
162 fprintf(stderr, "MoveFile succeeded but shouldn't have\n");
164 } else if (ERROR_FILE_NOT_FOUND != GetLastError()) {
165 fprintf(stderr, "MoveFile failed with unexpected code %d\n", GetLastError());
168 DeleteTestFile(_T("end.dat"));
170 /* Not correctly implemented in ros, destination file is kept open after this */
172 printf("Testing move to existing file\n");
173 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE);
174 CreateTestFile(_T("end.dat"), FILE_ATTRIBUTE_ARCHIVE);
175 if (MoveFile(_T("begin.dat"), _T("end.dat"))) {
176 fprintf(stderr, "MoveFile succeeded but shouldn't have\n");
178 } else if (ERROR_ALREADY_EXISTS != GetLastError()) {
179 fprintf(stderr, "MoveFile failed with unexpected code %d\n", GetLastError());
182 DeleteTestFile(_T("begin.dat"));
183 DeleteTestFile(_T("end.dat"));
186 /* Not implemented yet in ros */
188 printf("Testing directory move\n");
189 CreateTestDir(_T("begin"));
190 CreateTestFile(_T("begin\\file.dat"), FILE_ATTRIBUTE_NORMAL);
191 DeleteTestDir(_T("end"));
192 if (! MoveFile(_T("begin"), _T("end"))) {
193 fprintf(stderr, "MoveFile failed with code %d\n", GetLastError());
196 CheckTestFile(_T("end\\file.dat"), FILE_ATTRIBUTE_NORMAL);
197 DeleteTestFile(_T("end\\file.dat"));
198 DeleteTestDir(_T("end"));
201 printf("Testing file move to different directory\n");
202 CreateTestFile(_T("file.dat"), FILE_ATTRIBUTE_NORMAL);
203 CreateTestDir(_T("end"));
204 if (! MoveFile(_T("file.dat"), _T("end\\file.dat"))) {
205 fprintf(stderr, "MoveFile failed with code %d\n", GetLastError());
208 CheckTestFile(_T("end\\file.dat"), FILE_ATTRIBUTE_ARCHIVE);
209 DeleteTestFile(_T("end\\file.dat"));
210 DeleteTestDir(_T("end"));
212 printf("Testing move of read-only file\n");
213 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_READONLY);
214 DeleteTestFile(_T("end.dat"));
215 if (! MoveFile(_T("begin.dat"), _T("end.dat"))) {
216 fprintf(stderr, "MoveFile failed with code %d\n", GetLastError());
219 CheckTestFile(_T("end.dat"), FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_READONLY);
220 DeleteTestFile(_T("end.dat"));
222 printf("Testing move to different drive\n");
223 if (_T(' ') != otherdrive) {
224 otherfile[0] = otherdrive;
225 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE);
226 DeleteTestFile(otherfile);
227 if (! MoveFile(_T("begin.dat"), otherfile)) {
228 fprintf(stderr, "MoveFile failed with code %d\n", GetLastError());
231 CheckTestFile(otherfile, FILE_ATTRIBUTE_ARCHIVE);
232 DeleteTestFile(otherfile);
234 printf(" Test skipped, no other drive available\n");
237 printf("Testing move/overwrite of existing file\n");
238 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE);
239 CreateTestFile(_T("end.dat"), FILE_ATTRIBUTE_ARCHIVE);
240 if (! MoveFileEx(_T("begin.dat"), _T("end.dat"), MOVEFILE_REPLACE_EXISTING)) {
241 fprintf(stderr, "MoveFileEx failed with code %d\n", GetLastError());
244 DeleteTestFile(_T("begin.dat"));
245 DeleteTestFile(_T("end.dat"));
247 /* Not (correctly) implemented in ros yet */
249 printf("Testing move/overwrite of existing readonly file\n");
250 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE);
251 CreateTestFile(_T("end.dat"), FILE_ATTRIBUTE_READONLY);
252 if (MoveFileEx(_T("begin.dat"), _T("end.dat"), MOVEFILE_REPLACE_EXISTING)) {
253 fprintf(stderr, "MoveFileEx succeeded but shouldn't have\n");
255 } else if (ERROR_ALREADY_EXISTS != GetLastError() &&
256 ERROR_ACCESS_DENIED != GetLastError()) {
257 fprintf(stderr, "MoveFileEx failed with unexpected code %d\n", GetLastError());
260 DeleteTestFile(_T("begin.dat"));
261 DeleteTestFile(_T("end.dat"));
264 /* Not implemented in ros yet */
266 printf("Testing move to different drive without COPY_ALLOWED\n");
267 if (_T(' ') != otherdrive) {
268 otherfile[0] = otherdrive;
269 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE);
270 DeleteTestFile(otherfile);
271 if (MoveFileEx(_T("begin.dat"), otherfile, 0)) {
272 fprintf(stderr, "MoveFileEx succeeded but shouldn't have\n");
274 } else if (ERROR_NOT_SAME_DEVICE != GetLastError()) {
275 fprintf(stderr, "MoveFileEx failed with unexpected code %d\n", GetLastError());
278 DeleteTestFile(otherfile);
280 printf(" Test skipped, no other drive available\n");
284 printf("Testing move to different drive with COPY_ALLOWED\n");
285 if (_T(' ') != otherdrive) {
286 otherfile[0] = otherdrive;
287 CreateTestFile(_T("begin.dat"), FILE_ATTRIBUTE_ARCHIVE);
288 DeleteTestFile(otherfile);
289 if (! MoveFileEx(_T("begin.dat"), otherfile, MOVEFILE_COPY_ALLOWED)) {
290 fprintf(stderr, "MoveFileEx failed with code %d\n", GetLastError());
293 CheckTestFile(otherfile, FILE_ATTRIBUTE_ARCHIVE);
294 DeleteTestFile(otherfile);
296 printf(" Test skipped, no other drive available\n");
299 printf("All tests successfully completed\n");