#include <aclapi.h>
#else
#define _FILE_OFFSET_BITS 64
+#include <cerrno>
+#include <unistd.h>
#include <sys/stat.h>
#include <grp.h>
#include <pwd.h>
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))
#endif
Stat::Stat():
+ exists(false),
type(UNKNOWN),
size(0),
alloc_size(0)
HANDLE handle;
handle = CreateFile(path.str().c_str(), 0, FILE_SHARE_READ, 0, OPEN_EXISTING, 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))
result.mtime = Time::TimeStamp(Time::filetime_to_rawtime(info.ftLastWriteTime));
PSECURITY_DESCRIPTOR sec_desc;
- PSID owner;
- PSID group;
+ PSID owner = 0;
+ PSID group = 0;
if(!GetSecurityInfo(handle, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION, &owner, &group, 0, 0, &sec_desc))
{
CloseHandle(handle);
throw system_error("GetSecurityInfo");
}
- result.owner = get_account_name(owner);
- result.group = get_account_name(group);
+ if(owner)
+ result.owner = get_account_name(owner);
+ if(group)
+ result.group = get_account_name(group);
LocalFree(sec_desc);
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
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