bool FileStream::Open(const char *name, dword mode) { LLOG("Open " << name << " mode: " << mode); Close(); int iomode = mode & ~SHAREMASK; if(IsWinNT()) handle = UnicodeWin32().CreateFileW(ToSystemCharsetW(name), iomode == READ ? GENERIC_READ : GENERIC_READ|GENERIC_WRITE, (mode & NOREADSHARE ? 0 : FILE_SHARE_READ) | (mode & NOWRITESHARE ? 0 : FILE_SHARE_WRITE) | (mode & DELETESHARE ? FILE_SHARE_DELETE : 0), NULL, iomode == READ ? OPEN_EXISTING : iomode == CREATE ? CREATE_ALWAYS : OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL ); else handle = CreateFile(ToSystemCharset(name), iomode == READ ? GENERIC_READ : GENERIC_READ|GENERIC_WRITE, (mode & NOREADSHARE ? 0 : FILE_SHARE_READ) | (mode & NOWRITESHARE ? 0 : FILE_SHARE_WRITE) | (mode & DELETESHARE ? FILE_SHARE_DELETE : 0), NULL, iomode == READ ? OPEN_EXISTING : iomode == CREATE ? CREATE_ALWAYS : OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL ); if(handle == INVALID_HANDLE_VALUE) { SetError(); return FALSE; } dword fsz_lo, fsz_hi; fsz_lo = ::GetFileSize(handle, &fsz_hi); int64 fsz; if(fsz_lo == 0xffffffff && GetLastError() != NO_ERROR) fsz = 0; else fsz = fsz_lo | (int64(fsz_hi) << 32); OpenInit(iomode, fsz); LLOG("OPEN " << handle); return TRUE; }
bool FileStream::Open(const char *name, dword mode, mode_t tmode) { Close(); int iomode = mode & ~SHAREMASK; handle = open(ToSystemCharset(name), iomode == READ ? O_RDONLY : iomode == CREATE ? O_CREAT|O_RDWR|O_TRUNC : O_RDWR|O_CREAT, tmode); if(handle >= 0) { if((mode & NOWRITESHARE) && flock(handle, LOCK_EX|LOCK_NB) < 0) { close(handle); handle = -1; return false; } int64 fsz = LSEEK64_(handle, 0, SEEK_END); if(fsz >= 0) { OpenInit(mode, fsz); return true; } } SetLastError(); return false; }