Exemple #1
0
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;
}
Exemple #2
0
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;
}