| 560 | } |
| 561 | |
| 562 | extern "C" JNIEXPORT jlong JNICALL |
| 563 | Java_java_io_File_lastModified(JNIEnv* e, jclass, jstring path) |
| 564 | { |
| 565 | string_t chars = getChars(e, path); |
| 566 | if (chars) { |
| 567 | #ifdef PLATFORM_WINDOWS |
| 568 | // Option: without opening file |
| 569 | // http://msdn.microsoft.com/en-us/library/windows/desktop/aa364946(v=vs.85).aspx |
| 570 | #if !defined(WINAPI_FAMILY) || WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) |
| 571 | HANDLE hFile = CreateFileW( |
| 572 | chars, FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); |
| 573 | #else |
| 574 | HANDLE hFile = CreateFile2( |
| 575 | chars, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr); |
| 576 | #endif |
| 577 | releaseChars(e, path, chars); |
| 578 | if (hFile == INVALID_HANDLE_VALUE) |
| 579 | return 0; |
| 580 | LARGE_INTEGER fileDate, filetimeToUnixEpochAdjustment; |
| 581 | filetimeToUnixEpochAdjustment.QuadPart = 11644473600000L * 10000L; |
| 582 | #if !defined(WINAPI_FAMILY) || WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) |
| 583 | FILETIME fileLastWriteTime; |
| 584 | if (!GetFileTime(hFile, 0, 0, &fileLastWriteTime)) { |
| 585 | CloseHandle(hFile); |
| 586 | return 0; |
| 587 | } |
| 588 | fileDate.HighPart = fileLastWriteTime.dwHighDateTime; |
| 589 | fileDate.LowPart = fileLastWriteTime.dwLowDateTime; |
| 590 | #else |
| 591 | FILE_BASIC_INFO fileInfo; |
| 592 | if (!GetFileInformationByHandleEx( |
| 593 | hFile, FileBasicInfo, &fileInfo, sizeof(fileInfo))) { |
| 594 | CloseHandle(hFile); |
| 595 | return 0; |
| 596 | } |
| 597 | fileDate = fileInfo.ChangeTime; |
| 598 | #endif |
| 599 | CloseHandle(hFile); |
| 600 | fileDate.QuadPart -= filetimeToUnixEpochAdjustment.QuadPart; |
| 601 | return fileDate.QuadPart / 10000000L; |
| 602 | #else |
| 603 | struct stat fileStat; |
| 604 | int res = stat(chars, &fileStat); |
| 605 | releaseChars(e, path, chars); |
| 606 | |
| 607 | if (res == -1) { |
| 608 | return 0; |
| 609 | } |
| 610 | #ifdef __APPLE__ |
| 611 | #define MTIME st_mtimespec |
| 612 | #else |
| 613 | #define MTIME st_mtim |
| 614 | #endif |
| 615 | return (static_cast<jlong>(fileStat.MTIME.tv_sec) * 1000) |
| 616 | + (static_cast<jlong>(fileStat.MTIME.tv_nsec) / (1000 * 1000)); |
| 617 | #endif |
| 618 | } |
| 619 |
nothing calls this directly
no test coverage detected