4#include "Stroika/Foundation/StroikaPreComp.h"
6#if qStroika_Foundation_Common_Platform_Windows
11#elif qStroika_Foundation_Common_Platform_POSIX
16#if qStroika_Foundation_Common_Platform_Linux
17#include <linux/limits.h>
21#include "Stroika/Foundation/Containers/Collection.h"
22#include "Stroika/Foundation/Containers/Set.h"
24#if qStroika_Foundation_Common_Platform_Windows
25#include "Stroika/Foundation/Execution/Platform/Windows/Exception.h"
26#include "Stroika/Foundation/Execution/Platform/Windows/HRESULTErrorException.h"
28#include "Stroika/Foundation/Execution/Exceptions.h"
33#include "DirectoryIterable.h"
36#include "FileSystem.h"
42using namespace Stroika::Foundation::IO;
45#if qStroika_Foundation_Common_Platform_Windows
60#if qStroika_Foundation_Common_Platform_POSIX
63 if ((accessMode & AccessMode::eRead) == AccessMode::eRead) {
64 if (access (fileFullPath.c_str (), R_OK) != 0) {
68 if ((accessMode & AccessMode::eWrite) == AccessMode::eWrite) {
69 if (access (fileFullPath.c_str (), W_OK) != 0) {
74#elif qStroika_Foundation_Common_Platform_Windows
75 if ((accessMode & AccessMode::eRead) == AccessMode::eRead) {
76 DWORD attribs = ::GetFileAttributesW (fileFullPath.c_str ());
77 if (attribs == INVALID_FILE_ATTRIBUTES) {
81 if ((accessMode & AccessMode::eWrite) == AccessMode::eWrite) {
82 DWORD attribs = ::GetFileAttributesW (fileFullPath.c_str ());
83 if ((attribs == INVALID_FILE_ATTRIBUTES) or (attribs & FILE_ATTRIBUTE_READONLY)) {
97 if (not
Access (fileFullPath, accessMode)) {
105 if (checkCanRead and checkCanWrite) {
106 CheckAccess (fileFullPath, IO::AccessMode::eReadWrite);
108 else if (checkCanRead) {
109 CheckAccess (fileFullPath, IO::AccessMode::eRead);
111 else if (checkCanWrite) {
112 CheckAccess (fileFullPath, IO::AccessMode::eWrite);
116DateTime IO::FileSystem::Ptr::GetFileLastModificationDate (
const filesystem::path& fileName)
118#if qStroika_Foundation_Common_Platform_POSIX
121 return DateTime{s.st_mtime};
122#elif qStroika_Foundation_Common_Platform_Windows
123 WIN32_FILE_ATTRIBUTE_DATA fileAttrData{};
124 FileSystem::Exception::ThrowIfZeroGetLastError (::GetFileAttributesExW (fileName.c_str (), GetFileExInfoStandard, &fileAttrData), fileName);
125 return DateTime{fileAttrData.ftLastWriteTime};
132DateTime IO::FileSystem::Ptr::GetFileLastAccessDate (
const filesystem::path& fileName)
134#if qStroika_Foundation_Common_Platform_POSIX
137 return DateTime{s.st_atime};
138#elif qStroika_Foundation_Common_Platform_Windows
139 WIN32_FILE_ATTRIBUTE_DATA fileAttrData{};
140 FileSystem::Exception::ThrowIfZeroGetLastError (::GetFileAttributesExW (fileName.c_str (), GetFileExInfoStandard, &fileAttrData), fileName);
141 return DateTime{fileAttrData.ftLastAccessTime};
#define AssertNotImplemented()
static INT_TYPE ThrowPOSIXErrNoIfNegative(INT_TYPE returnCode, const path &p1={}, const path &p2={})
nonvirtual void CheckAccess(const filesystem::path &fileFullPath, AccessMode accessMode=AccessMode::eRead)
nonvirtual bool Access(const filesystem::path &fileFullPath, AccessMode accessMode=AccessMode::eRead) const noexcept
void Throw(T &&e2Throw)
identical to builtin C++ 'throw' except that it does helpful, type dependent DbgTrace() messages firs...