Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(563)

Side by Side Diff: runtime/bin/file_win.cc

Issue 3001963002: [dart:io] Namespaces for file IO (Closed)
Patch Set: Fuchsia fix Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/bin/file_test.cc ('k') | runtime/bin/gen_snapshot.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "platform/globals.h" 5 #include "platform/globals.h"
6 #if defined(HOST_OS_WINDOWS) 6 #if defined(HOST_OS_WINDOWS)
7 7
8 #include "bin/file.h" 8 #include "bin/file.h"
9 9
10 #include <WinIoCtl.h> // NOLINT 10 #include <WinIoCtl.h> // NOLINT
11 #include <fcntl.h> // NOLINT 11 #include <fcntl.h> // NOLINT
12 #include <io.h> // NOLINT 12 #include <io.h> // NOLINT
13 #include <stdio.h> // NOLINT 13 #include <stdio.h> // NOLINT
14 #include <string.h> // NOLINT 14 #include <string.h> // NOLINT
15 #include <sys/stat.h> // NOLINT 15 #include <sys/stat.h> // NOLINT
16 #include <sys/utime.h> // NOLINT 16 #include <sys/utime.h> // NOLINT
17 17
18 #include "bin/builtin.h" 18 #include "bin/builtin.h"
19 #include "bin/log.h" 19 #include "bin/log.h"
20 #include "bin/namespace.h"
20 #include "bin/utils.h" 21 #include "bin/utils.h"
21 #include "bin/utils_win.h" 22 #include "bin/utils_win.h"
22 #include "platform/utils.h" 23 #include "platform/utils.h"
23 24
24 namespace dart { 25 namespace dart {
25 namespace bin { 26 namespace bin {
26 27
27 class FileHandle { 28 class FileHandle {
28 public: 29 public:
29 explicit FileHandle(int fd) : fd_(fd) {} 30 explicit FileHandle(int fd) : fd_(fd) {}
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 if ((((mode & kWrite) != 0) && ((mode & kTruncate) == 0)) || 266 if ((((mode & kWrite) != 0) && ((mode & kTruncate) == 0)) ||
266 (((mode & kWriteOnly) != 0) && ((mode & kTruncate) == 0))) { 267 (((mode & kWriteOnly) != 0) && ((mode & kTruncate) == 0))) {
267 int64_t position = _lseeki64(fd, 0, SEEK_END); 268 int64_t position = _lseeki64(fd, 0, SEEK_END);
268 if (position < 0) { 269 if (position < 0) {
269 return NULL; 270 return NULL;
270 } 271 }
271 } 272 }
272 return new File(new FileHandle(fd)); 273 return new File(new FileHandle(fd));
273 } 274 }
274 275
275 File* File::Open(const char* path, FileOpenMode mode) { 276 File* File::Open(Namespace* namespc, const char* path, FileOpenMode mode) {
276 Utf8ToWideScope system_name(path); 277 Utf8ToWideScope system_name(path);
277 File* file = FileOpenW(system_name.wide(), mode); 278 File* file = FileOpenW(system_name.wide(), mode);
278 return file; 279 return file;
279 } 280 }
280 281
281 File* File::OpenStdio(int fd) { 282 File* File::OpenStdio(int fd) {
282 int stdio_fd = -1; 283 int stdio_fd = -1;
283 switch (fd) { 284 switch (fd) {
284 case 1: 285 case 1:
285 stdio_fd = _fileno(stdout); 286 stdio_fd = _fileno(stdout);
(...skipping 13 matching lines...) Expand all
299 if (stat_status != 0) { 300 if (stat_status != 0) {
300 return false; 301 return false;
301 } 302 }
302 if ((st->st_mode & S_IFMT) != S_IFREG) { 303 if ((st->st_mode & S_IFMT) != S_IFREG) {
303 SetLastError(ERROR_NOT_SUPPORTED); 304 SetLastError(ERROR_NOT_SUPPORTED);
304 return false; 305 return false;
305 } 306 }
306 return true; 307 return true;
307 } 308 }
308 309
309 bool File::Exists(const char* name) { 310 bool File::Exists(Namespace* namespc, const char* name) {
310 struct __stat64 st; 311 struct __stat64 st;
311 Utf8ToWideScope system_name(name); 312 Utf8ToWideScope system_name(name);
312 return StatHelper(system_name.wide(), &st); 313 return StatHelper(system_name.wide(), &st);
313 } 314 }
314 315
315 bool File::Create(const char* name) { 316 bool File::Create(Namespace* namespc, const char* name) {
316 Utf8ToWideScope system_name(name); 317 Utf8ToWideScope system_name(name);
317 int fd = _wopen(system_name.wide(), O_RDONLY | O_CREAT, 0666); 318 int fd = _wopen(system_name.wide(), O_RDONLY | O_CREAT, 0666);
318 if (fd < 0) { 319 if (fd < 0) {
319 return false; 320 return false;
320 } 321 }
321 return (close(fd) == 0); 322 return (close(fd) == 0);
322 } 323 }
323 324
324 // This structure is needed for creating and reading Junctions. 325 // This structure is needed for creating and reading Junctions.
325 typedef struct _REPARSE_DATA_BUFFER { 326 typedef struct _REPARSE_DATA_BUFFER {
(...skipping 21 matching lines...) Expand all
347 348
348 struct { 349 struct {
349 UCHAR DataBuffer[1]; 350 UCHAR DataBuffer[1];
350 } GenericReparseBuffer; 351 } GenericReparseBuffer;
351 }; 352 };
352 } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; 353 } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
353 354
354 static const int kReparseDataHeaderSize = sizeof ULONG + 2 * sizeof USHORT; 355 static const int kReparseDataHeaderSize = sizeof ULONG + 2 * sizeof USHORT;
355 static const int kMountPointHeaderSize = 4 * sizeof USHORT; 356 static const int kMountPointHeaderSize = 4 * sizeof USHORT;
356 357
357 bool File::CreateLink(const char* utf8_name, const char* utf8_target) { 358 bool File::CreateLink(Namespace* namespc, const char* utf8_name, const char* utf 8_target) {
358 Utf8ToWideScope name(utf8_name); 359 Utf8ToWideScope name(utf8_name);
359 int create_status = CreateDirectoryW(name.wide(), NULL); 360 int create_status = CreateDirectoryW(name.wide(), NULL);
360 // If the directory already existed, treat it as a success. 361 // If the directory already existed, treat it as a success.
361 if ((create_status == 0) && 362 if ((create_status == 0) &&
362 ((GetLastError() != ERROR_ALREADY_EXISTS) || 363 ((GetLastError() != ERROR_ALREADY_EXISTS) ||
363 ((GetFileAttributesW(name.wide()) & FILE_ATTRIBUTE_DIRECTORY) != 0))) { 364 ((GetFileAttributesW(name.wide()) & FILE_ATTRIBUTE_DIRECTORY) != 0))) {
364 return false; 365 return false;
365 } 366 }
366 367
367 HANDLE dir_handle = CreateFileW( 368 HANDLE dir_handle = CreateFileW(
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 dir_handle, FSCTL_SET_REPARSE_POINT, reparse_data_buffer, 405 dir_handle, FSCTL_SET_REPARSE_POINT, reparse_data_buffer,
405 reparse_data_buffer->ReparseDataLength + kReparseDataHeaderSize, NULL, 0, 406 reparse_data_buffer->ReparseDataLength + kReparseDataHeaderSize, NULL, 0,
406 &dummy_received_bytes, NULL); 407 &dummy_received_bytes, NULL);
407 free(reparse_data_buffer); 408 free(reparse_data_buffer);
408 if (CloseHandle(dir_handle) == 0) { 409 if (CloseHandle(dir_handle) == 0) {
409 return false; 410 return false;
410 } 411 }
411 return (result != 0); 412 return (result != 0);
412 } 413 }
413 414
414 bool File::Delete(const char* name) { 415 bool File::Delete(Namespace* namespc, const char* name) {
415 Utf8ToWideScope system_name(name); 416 Utf8ToWideScope system_name(name);
416 int status = _wremove(system_name.wide()); 417 int status = _wremove(system_name.wide());
417 return status != -1; 418 return status != -1;
418 } 419 }
419 420
420 bool File::DeleteLink(const char* name) { 421 bool File::DeleteLink(Namespace* namespc, const char* name) {
421 Utf8ToWideScope system_name(name); 422 Utf8ToWideScope system_name(name);
422 bool result = false; 423 bool result = false;
423 DWORD attributes = GetFileAttributesW(system_name.wide()); 424 DWORD attributes = GetFileAttributesW(system_name.wide());
424 if ((attributes != INVALID_FILE_ATTRIBUTES) && 425 if ((attributes != INVALID_FILE_ATTRIBUTES) &&
425 (attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) { 426 (attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
426 // It's a junction(link), delete it. 427 // It's a junction(link), delete it.
427 result = (RemoveDirectoryW(system_name.wide()) != 0); 428 result = (RemoveDirectoryW(system_name.wide()) != 0);
428 } else { 429 } else {
429 SetLastError(ERROR_NOT_A_REPARSE_POINT); 430 SetLastError(ERROR_NOT_A_REPARSE_POINT);
430 } 431 }
431 return result; 432 return result;
432 } 433 }
433 434
434 bool File::Rename(const char* old_path, const char* new_path) { 435 bool File::Rename(Namespace* namespc, const char* old_path, const char* new_path ) {
435 File::Type type = GetType(old_path, false); 436 File::Type type = GetType(namespc, old_path, false);
436 if (type == kIsFile) { 437 if (type == kIsFile) {
437 Utf8ToWideScope system_old_path(old_path); 438 Utf8ToWideScope system_old_path(old_path);
438 Utf8ToWideScope system_new_path(new_path); 439 Utf8ToWideScope system_new_path(new_path);
439 DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING; 440 DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING;
440 int move_status = 441 int move_status =
441 MoveFileExW(system_old_path.wide(), system_new_path.wide(), flags); 442 MoveFileExW(system_old_path.wide(), system_new_path.wide(), flags);
442 return (move_status != 0); 443 return (move_status != 0);
443 } else { 444 } else {
444 SetLastError(ERROR_FILE_NOT_FOUND); 445 SetLastError(ERROR_FILE_NOT_FOUND);
445 } 446 }
446 return false; 447 return false;
447 } 448 }
448 449
449 bool File::RenameLink(const char* old_path, const char* new_path) { 450 bool File::RenameLink(Namespace* namespc, const char* old_path, const char* new_ path) {
450 File::Type type = GetType(old_path, false); 451 File::Type type = GetType(namespc, old_path, false);
451 if (type == kIsLink) { 452 if (type == kIsLink) {
452 Utf8ToWideScope system_old_path(old_path); 453 Utf8ToWideScope system_old_path(old_path);
453 Utf8ToWideScope system_new_path(new_path); 454 Utf8ToWideScope system_new_path(new_path);
454 DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING; 455 DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING;
455 int move_status = 456 int move_status =
456 MoveFileExW(system_old_path.wide(), system_new_path.wide(), flags); 457 MoveFileExW(system_old_path.wide(), system_new_path.wide(), flags);
457 return (move_status != 0); 458 return (move_status != 0);
458 } else { 459 } else {
459 SetLastError(ERROR_FILE_NOT_FOUND); 460 SetLastError(ERROR_FILE_NOT_FOUND);
460 } 461 }
461 return false; 462 return false;
462 } 463 }
463 464
464 bool File::Copy(const char* old_path, const char* new_path) { 465 bool File::Copy(Namespace* namespc, const char* old_path, const char* new_path) {
465 File::Type type = GetType(old_path, false); 466 File::Type type = GetType(namespc, old_path, false);
466 if (type == kIsFile) { 467 if (type == kIsFile) {
467 Utf8ToWideScope system_old_path(old_path); 468 Utf8ToWideScope system_old_path(old_path);
468 Utf8ToWideScope system_new_path(new_path); 469 Utf8ToWideScope system_new_path(new_path);
469 bool success = CopyFileExW(system_old_path.wide(), system_new_path.wide(), 470 bool success = CopyFileExW(system_old_path.wide(), system_new_path.wide(),
470 NULL, NULL, NULL, 0) != 0; 471 NULL, NULL, NULL, 0) != 0;
471 return success; 472 return success;
472 } else { 473 } else {
473 SetLastError(ERROR_FILE_NOT_FOUND); 474 SetLastError(ERROR_FILE_NOT_FOUND);
474 } 475 }
475 return false; 476 return false;
476 } 477 }
477 478
478 int64_t File::LengthFromPath(const char* name) { 479 int64_t File::LengthFromPath(Namespace* namespc, const char* name) {
479 struct __stat64 st; 480 struct __stat64 st;
480 Utf8ToWideScope system_name(name); 481 Utf8ToWideScope system_name(name);
481 if (!StatHelper(system_name.wide(), &st)) { 482 if (!StatHelper(system_name.wide(), &st)) {
482 return -1; 483 return -1;
483 } 484 }
484 return st.st_size; 485 return st.st_size;
485 } 486 }
486 487
487 const char* File::LinkTarget(const char* pathname) { 488 const char* File::LinkTarget(Namespace* namespc, const char* pathname) {
488 const wchar_t* name = StringUtilsWin::Utf8ToWide(pathname); 489 const wchar_t* name = StringUtilsWin::Utf8ToWide(pathname);
489 HANDLE dir_handle = CreateFileW( 490 HANDLE dir_handle = CreateFileW(
490 name, GENERIC_READ, 491 name, GENERIC_READ,
491 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, 492 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
492 OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, 493 OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
493 NULL); 494 NULL);
494 if (dir_handle == INVALID_HANDLE_VALUE) { 495 if (dir_handle == INVALID_HANDLE_VALUE) {
495 return NULL; 496 return NULL;
496 } 497 }
497 498
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
540 0, NULL, NULL); 541 0, NULL, NULL);
541 char* utf8_target = DartUtils::ScopedCString(utf8_length + 1); 542 char* utf8_target = DartUtils::ScopedCString(utf8_length + 1);
542 if (0 == WideCharToMultiByte(CP_UTF8, 0, target, target_length, utf8_target, 543 if (0 == WideCharToMultiByte(CP_UTF8, 0, target, target_length, utf8_target,
543 utf8_length, NULL, NULL)) { 544 utf8_length, NULL, NULL)) {
544 return NULL; 545 return NULL;
545 } 546 }
546 utf8_target[utf8_length] = '\0'; 547 utf8_target[utf8_length] = '\0';
547 return utf8_target; 548 return utf8_target;
548 } 549 }
549 550
550 void File::Stat(const char* name, int64_t* data) { 551 void File::Stat(Namespace* namespc, const char* name, int64_t* data) {
551 File::Type type = GetType(name, false); 552 File::Type type = GetType(namespc, name, false);
552 data[kType] = type; 553 data[kType] = type;
553 if (type != kDoesNotExist) { 554 if (type != kDoesNotExist) {
554 struct _stat64 st; 555 struct _stat64 st;
555 Utf8ToWideScope system_name(name); 556 Utf8ToWideScope system_name(name);
556 int stat_status = _wstat64(system_name.wide(), &st); 557 int stat_status = _wstat64(system_name.wide(), &st);
557 if (stat_status == 0) { 558 if (stat_status == 0) {
558 data[kCreatedTime] = st.st_ctime * 1000; 559 data[kCreatedTime] = st.st_ctime * 1000;
559 data[kModifiedTime] = st.st_mtime * 1000; 560 data[kModifiedTime] = st.st_mtime * 1000;
560 data[kAccessedTime] = st.st_atime * 1000; 561 data[kAccessedTime] = st.st_atime * 1000;
561 data[kMode] = st.st_mode; 562 data[kMode] = st.st_mode;
562 data[kSize] = st.st_size; 563 data[kSize] = st.st_size;
563 } else { 564 } else {
564 data[kType] = File::kDoesNotExist; 565 data[kType] = File::kDoesNotExist;
565 } 566 }
566 } 567 }
567 } 568 }
568 569
569 time_t File::LastAccessed(const char* name) { 570 time_t File::LastAccessed(Namespace* namespc, const char* name) {
570 struct __stat64 st; 571 struct __stat64 st;
571 Utf8ToWideScope system_name(name); 572 Utf8ToWideScope system_name(name);
572 if (!StatHelper(system_name.wide(), &st)) { 573 if (!StatHelper(system_name.wide(), &st)) {
573 return -1; 574 return -1;
574 } 575 }
575 return st.st_atime; 576 return st.st_atime;
576 } 577 }
577 578
578 time_t File::LastModified(const char* name) { 579 time_t File::LastModified(Namespace* namespc, const char* name) {
579 struct __stat64 st; 580 struct __stat64 st;
580 Utf8ToWideScope system_name(name); 581 Utf8ToWideScope system_name(name);
581 if (!StatHelper(system_name.wide(), &st)) { 582 if (!StatHelper(system_name.wide(), &st)) {
582 return -1; 583 return -1;
583 } 584 }
584 return st.st_mtime; 585 return st.st_mtime;
585 } 586 }
586 587
587 bool File::SetLastAccessed(const char* name, int64_t millis) { 588 bool File::SetLastAccessed(Namespace* namespc, const char* name, int64_t millis) {
588 // First get the current times. 589 // First get the current times.
589 struct __stat64 st; 590 struct __stat64 st;
590 Utf8ToWideScope system_name(name); 591 Utf8ToWideScope system_name(name);
591 if (!StatHelper(system_name.wide(), &st)) { 592 if (!StatHelper(system_name.wide(), &st)) {
592 return false; 593 return false;
593 } 594 }
594 595
595 // Set the new time: 596 // Set the new time:
596 struct __utimbuf64 times; 597 struct __utimbuf64 times;
597 times.actime = millis / kMillisecondsPerSecond; 598 times.actime = millis / kMillisecondsPerSecond;
598 times.modtime = st.st_mtime; 599 times.modtime = st.st_mtime;
599 return _wutime64(system_name.wide(), &times) == 0; 600 return _wutime64(system_name.wide(), &times) == 0;
600 } 601 }
601 602
602 bool File::SetLastModified(const char* name, int64_t millis) { 603 bool File::SetLastModified(Namespace* namespc, const char* name, int64_t millis) {
603 // First get the current times. 604 // First get the current times.
604 struct __stat64 st; 605 struct __stat64 st;
605 Utf8ToWideScope system_name(name); 606 Utf8ToWideScope system_name(name);
606 if (!StatHelper(system_name.wide(), &st)) { 607 if (!StatHelper(system_name.wide(), &st)) {
607 return false; 608 return false;
608 } 609 }
609 610
610 // Set the new time: 611 // Set the new time:
611 struct __utimbuf64 times; 612 struct __utimbuf64 times;
612 times.actime = st.st_atime; 613 times.actime = st.st_atime;
613 times.modtime = millis / kMillisecondsPerSecond; 614 times.modtime = millis / kMillisecondsPerSecond;
614 return _wutime64(system_name.wide(), &times) == 0; 615 return _wutime64(system_name.wide(), &times) == 0;
615 } 616 }
616 617
617 bool File::IsAbsolutePath(const char* pathname) { 618 bool File::IsAbsolutePath(const char* pathname) {
618 // Should we consider network paths? 619 // Should we consider network paths?
619 if (pathname == NULL) { 620 if (pathname == NULL) {
620 return false; 621 return false;
621 } 622 }
622 return ((strlen(pathname) > 2) && (pathname[1] == ':') && 623 return ((strlen(pathname) > 2) && (pathname[1] == ':') &&
623 ((pathname[2] == '\\') || (pathname[2] == '/'))); 624 ((pathname[2] == '\\') || (pathname[2] == '/')));
624 } 625 }
625 626
626 const char* File::GetCanonicalPath(const char* pathname) { 627 const char* File::GetCanonicalPath(Namespace* namespc, const char* pathname) {
627 Utf8ToWideScope system_name(pathname); 628 Utf8ToWideScope system_name(pathname);
628 HANDLE file_handle = 629 HANDLE file_handle =
629 CreateFileW(system_name.wide(), 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, 630 CreateFileW(system_name.wide(), 0, FILE_SHARE_READ, NULL, OPEN_EXISTING,
630 FILE_FLAG_BACKUP_SEMANTICS, NULL); 631 FILE_FLAG_BACKUP_SEMANTICS, NULL);
631 if (file_handle == INVALID_HANDLE_VALUE) { 632 if (file_handle == INVALID_HANDLE_VALUE) {
632 return NULL; 633 return NULL;
633 } 634 }
634 wchar_t dummy_buffer[1]; 635 wchar_t dummy_buffer[1];
635 int required_size = 636 int required_size =
636 GetFinalPathNameByHandle(file_handle, dummy_buffer, 0, VOLUME_NAME_DOS); 637 GetFinalPathNameByHandle(file_handle, dummy_buffer, 0, VOLUME_NAME_DOS);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
668 // This is already UTF-8 encoded. 669 // This is already UTF-8 encoded.
669 return "\\\\"; 670 return "\\\\";
670 } 671 }
671 672
672 File::StdioHandleType File::GetStdioHandleType(int fd) { 673 File::StdioHandleType File::GetStdioHandleType(int fd) {
673 // Treat all stdio handles as pipes. The Windows event handler and 674 // Treat all stdio handles as pipes. The Windows event handler and
674 // socket code will handle the different handle types. 675 // socket code will handle the different handle types.
675 return kPipe; 676 return kPipe;
676 } 677 }
677 678
678 File::Type File::GetType(const char* pathname, bool follow_links) { 679 File::Type File::GetType(Namespace* namespc, const char* pathname, bool follow_l inks) {
679 // Convert to wchar_t string. 680 // Convert to wchar_t string.
680 Utf8ToWideScope name(pathname); 681 Utf8ToWideScope name(pathname);
681 DWORD attributes = GetFileAttributesW(name.wide()); 682 DWORD attributes = GetFileAttributesW(name.wide());
682 File::Type result = kIsFile; 683 File::Type result = kIsFile;
683 if (attributes == INVALID_FILE_ATTRIBUTES) { 684 if (attributes == INVALID_FILE_ATTRIBUTES) {
684 result = kDoesNotExist; 685 result = kDoesNotExist;
685 } else if ((attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) { 686 } else if ((attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
686 if (follow_links) { 687 if (follow_links) {
687 HANDLE dir_handle = 688 HANDLE dir_handle =
688 CreateFileW(name.wide(), 0, 689 CreateFileW(name.wide(), 0,
689 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 690 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
690 NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); 691 NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
691 if (dir_handle == INVALID_HANDLE_VALUE) { 692 if (dir_handle == INVALID_HANDLE_VALUE) {
692 result = File::kIsLink; 693 result = File::kIsLink;
693 } else { 694 } else {
694 CloseHandle(dir_handle); 695 CloseHandle(dir_handle);
695 result = File::kIsDirectory; 696 result = File::kIsDirectory;
696 } 697 }
697 } else { 698 } else {
698 result = kIsLink; 699 result = kIsLink;
699 } 700 }
700 } else if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { 701 } else if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
701 result = kIsDirectory; 702 result = kIsDirectory;
702 } 703 }
703 return result; 704 return result;
704 } 705 }
705 706
706 File::Identical File::AreIdentical(const char* file_1, const char* file_2) { 707 File::Identical File::AreIdentical(Namespace* namespc, const char* file_1, const char* file_2) {
707 BY_HANDLE_FILE_INFORMATION file_info[2]; 708 BY_HANDLE_FILE_INFORMATION file_info[2];
708 const char* file_names[2] = {file_1, file_2}; 709 const char* file_names[2] = {file_1, file_2};
709 for (int i = 0; i < 2; ++i) { 710 for (int i = 0; i < 2; ++i) {
710 Utf8ToWideScope wide_name(file_names[i]); 711 Utf8ToWideScope wide_name(file_names[i]);
711 HANDLE file_handle = CreateFileW( 712 HANDLE file_handle = CreateFileW(
712 wide_name.wide(), 0, 713 wide_name.wide(), 0,
713 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, 714 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
714 OPEN_EXISTING, 715 OPEN_EXISTING,
715 FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL); 716 FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
716 if (file_handle == INVALID_HANDLE_VALUE) { 717 if (file_handle == INVALID_HANDLE_VALUE) {
(...skipping 17 matching lines...) Expand all
734 return kIdentical; 735 return kIdentical;
735 } else { 736 } else {
736 return kDifferent; 737 return kDifferent;
737 } 738 }
738 } 739 }
739 740
740 } // namespace bin 741 } // namespace bin
741 } // namespace dart 742 } // namespace dart
742 743
743 #endif // defined(HOST_OS_WINDOWS) 744 #endif // defined(HOST_OS_WINDOWS)
OLDNEW
« no previous file with comments | « runtime/bin/file_test.cc ('k') | runtime/bin/gen_snapshot.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698