| 2438 | } |
| 2439 | |
| 2440 | std::int64_t FileSystem::GetFileSize(StringView path) |
| 2441 | { |
| 2442 | if (path.empty()) return false; |
| 2443 | |
| 2444 | #if defined(DEATH_TARGET_WINDOWS) |
| 2445 | # if defined(DEATH_TARGET_WINDOWS_RT) |
| 2446 | SmallVector<wchar_t, MAX_PATH + 1> pathW(path.size() + 1); |
| 2447 | Utf8::ToUtf16(pathW.data(), std::int32_t(pathW.size()), path.data(), std::int32_t(path.size())); |
| 2448 | HANDLE hFile = ::CreateFileFromAppW(pathW.data(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); |
| 2449 | # else |
| 2450 | SmallVector<wchar_t, MAX_PATH + 1> pathW(path.size() + 1); |
| 2451 | Utf8::ToUtf16(pathW.data(), std::int32_t(pathW.size()), path.data(), std::int32_t(path.size())); |
| 2452 | HANDLE hFile = ::CreateFileW(pathW.data(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); |
| 2453 | # endif |
| 2454 | LARGE_INTEGER fileSize; |
| 2455 | fileSize.QuadPart = 0; |
| 2456 | const BOOL status = ::GetFileSizeEx(hFile, &fileSize); |
| 2457 | ::CloseHandle(hFile); |
| 2458 | return (status != 0 ? static_cast<std::int64_t>(fileSize.QuadPart) : -1); |
| 2459 | #else |
| 2460 | auto nullTerminatedPath = String::nullTerminatedView(path); |
| 2461 | # if defined(DEATH_TARGET_ANDROID) |
| 2462 | if (auto strippedPath = AndroidAssetStream::TryGetAssetPath(nullTerminatedPath)) { |
| 2463 | return AndroidAssetStream::GetFileSize(strippedPath); |
| 2464 | } |
| 2465 | # endif |
| 2466 | struct stat sb; |
| 2467 | if (::stat(nullTerminatedPath.data(), &sb) != 0) { |
| 2468 | return -1; |
| 2469 | } |
| 2470 | return static_cast<std::int64_t>(sb.st_size); |
| 2471 | #endif |
| 2472 | } |
| 2473 | |
| 2474 | DateTime FileSystem::GetCreationTime(StringView path) |
| 2475 | { |