| 1607 | } |
| 1608 | |
| 1609 | bool FileSystem::FileExists(StringView path) |
| 1610 | { |
| 1611 | if (path.empty()) return false; |
| 1612 | |
| 1613 | #if defined(DEATH_TARGET_WINDOWS_RT) |
| 1614 | SmallVector<wchar_t, MAX_PATH + 1> pathW(DefaultInit, path.size() + 1); |
| 1615 | Utf8::ToUtf16(pathW.data(), std::int32_t(pathW.size()), path.data(), std::int32_t(path.size())); |
| 1616 | WIN32_FILE_ATTRIBUTE_DATA lpFileInfo; |
| 1617 | return (::GetFileAttributesExFromAppW(pathW.data(), GetFileExInfoStandard, &lpFileInfo) && (lpFileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY); |
| 1618 | #elif defined(DEATH_TARGET_WINDOWS) |
| 1619 | SmallVector<wchar_t, MAX_PATH + 1> pathW(DefaultInit, path.size() + 1); |
| 1620 | Utf8::ToUtf16(pathW.data(), std::int32_t(pathW.size()), path.data(), std::int32_t(path.size())); |
| 1621 | const DWORD attrs = ::GetFileAttributesW(pathW.data()); |
| 1622 | return (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY); |
| 1623 | #else |
| 1624 | auto nullTerminatedPath = String::nullTerminatedView(path); |
| 1625 | # if defined(DEATH_TARGET_ANDROID) |
| 1626 | if (auto strippedPath = AndroidAssetStream::TryGetAssetPath(nullTerminatedPath)) { |
| 1627 | return AndroidAssetStream::TryOpenFile(strippedPath); |
| 1628 | } |
| 1629 | # endif |
| 1630 | struct stat sb; |
| 1631 | if (::stat(nullTerminatedPath.data(), &sb) == 0) { |
| 1632 | return ((sb.st_mode & S_IFMT) == S_IFREG); |
| 1633 | } |
| 1634 | return false; |
| 1635 | #endif |
| 1636 | } |
| 1637 | |
| 1638 | bool FileSystem::Exists(StringView path) |
| 1639 | { |