| 1950 | } |
| 1951 | |
| 1952 | bool FileSystem::IsReadOnly(StringView path) |
| 1953 | { |
| 1954 | if (path.empty()) return false; |
| 1955 | |
| 1956 | #if defined(DEATH_TARGET_WINDOWS_RT) |
| 1957 | SmallVector<wchar_t, MAX_PATH + 1> pathW(DefaultInit, path.size() + 1); |
| 1958 | Utf8::ToUtf16(pathW.data(), std::int32_t(pathW.size()), path.data(), std::int32_t(path.size())); |
| 1959 | WIN32_FILE_ATTRIBUTE_DATA lpFileInfo; |
| 1960 | return (::GetFileAttributesExFromAppW(pathW.data(), GetFileExInfoStandard, &lpFileInfo) && (lpFileInfo.dwFileAttributes & FILE_ATTRIBUTE_READONLY) == FILE_ATTRIBUTE_READONLY); |
| 1961 | #elif defined(DEATH_TARGET_WINDOWS) |
| 1962 | SmallVector<wchar_t, MAX_PATH + 1> pathW(DefaultInit, path.size() + 1); |
| 1963 | Utf8::ToUtf16(pathW.data(), std::int32_t(pathW.size()), path.data(), std::int32_t(path.size())); |
| 1964 | const DWORD attrs = ::GetFileAttributesW(pathW.data()); |
| 1965 | return (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_READONLY) == FILE_ATTRIBUTE_READONLY); |
| 1966 | #elif defined(DEATH_TARGET_APPLE) || defined(__FreeBSD__) |
| 1967 | auto nullTerminatedPath = String::nullTerminatedView(path); |
| 1968 | struct stat sb; |
| 1969 | return (::stat(nullTerminatedPath.data(), &sb) == 0 && (sb.st_flags & UF_IMMUTABLE) == UF_IMMUTABLE); |
| 1970 | #else |
| 1971 | return false; |
| 1972 | #endif |
| 1973 | } |
| 1974 | |
| 1975 | bool FileSystem::SetReadOnly(StringView path, bool readonly) |
| 1976 | { |