X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffs%2Fstat.cpp;h=77564f0ecd2d6c49b3297db2733686423de870bb;hp=d11867d99b6af41a427dba423673acc622390a65;hb=330373a422c3b75d117e1a0eed72ca868bccb5b9;hpb=e14321c38b34ec1cc5641b267f031693a8f7bc27 diff --git a/source/fs/stat.cpp b/source/fs/stat.cpp index d11867d..77564f0 100644 --- a/source/fs/stat.cpp +++ b/source/fs/stat.cpp @@ -3,6 +3,8 @@ #include #else #define _FILE_OFFSET_BITS 64 +#include +#include #include #include #include @@ -46,6 +48,7 @@ struct Stat::Private Stat Stat::Private::from_struct_stat(const struct stat &st) { Stat result; + result.exists = true; if(S_ISREG(st.st_mode)) result.type = REGULAR; else if(S_ISDIR(st.st_mode)) @@ -79,6 +82,7 @@ Stat Stat::Private::from_struct_stat(const struct stat &st) #endif Stat::Stat(): + exists(false), type(UNKNOWN), size(0), alloc_size(0) @@ -88,9 +92,15 @@ Stat Stat::stat(const Path &path) { #ifdef WIN32 HANDLE handle; - handle = CreateFile(path.str().c_str(), 0, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + handle = CreateFile(path.str().c_str(), READ_CONTROL, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS, 0); if(handle==INVALID_HANDLE_VALUE) - throw system_error("CreateFile"); + { + DWORD err = GetLastError(); + if(err==ERROR_FILE_NOT_FOUND) + return Stat(); + else + throw system_error("CreateFile", err); + } BY_HANDLE_FILE_INFORMATION info; if(!GetFileInformationByHandle(handle, &info)) @@ -112,10 +122,12 @@ Stat Stat::stat(const Path &path) PSECURITY_DESCRIPTOR sec_desc; PSID owner = 0; PSID group = 0; - if(!GetSecurityInfo(handle, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION, &owner, &group, 0, 0, &sec_desc)) + const SECURITY_INFORMATION sec_info = OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION; + DWORD err = GetSecurityInfo(handle, SE_FILE_OBJECT, sec_info, &owner, &group, 0, 0, &sec_desc); + if(err) { CloseHandle(handle); - throw system_error("GetSecurityInfo"); + throw system_error("GetSecurityInfo", err); } if(owner) @@ -132,7 +144,12 @@ Stat Stat::stat(const Path &path) struct stat st; int ret = ::stat(path.str().c_str(), &st); if(ret==-1) - throw system_error("stat"); + { + if(errno==ENOENT) + return Stat(); + else + throw system_error("stat"); + } return Private::from_struct_stat(st); #endif @@ -146,7 +163,12 @@ Stat Stat::lstat(const Path &path) struct stat st; int ret = ::lstat(path.str().c_str(), &st); if(ret==-1) - throw system_error("lstat"); + { + if(errno==ENOENT) + return Stat(); + else + throw system_error("lstat"); + } return Private::from_struct_stat(st); #endif