void FileStream::SetStreamSize(int64 pos) { if(handle < 0) return; LOFF_T_ cur = LSEEK64_(handle, 0, SEEK_CUR); if(cur < 0) { SetLastError(); return; } LOFF_T_ len = LSEEK64_(handle, 0, SEEK_END); if(len < 0) { SetLastError(); LSEEK64_(handle, cur, SEEK_SET); return; } while(pos > len) { static char buffer[1024]; int64 diff = pos - len; int chunk = (diff > (int64)sizeof(buffer) ? sizeof(buffer) : (int)diff); if(write(handle, buffer, chunk) != chunk) { SetLastError(); LSEEK64_(handle, cur, SEEK_SET); return; } len += chunk; } if(pos < len) { if(cur > pos) LSEEK64_(handle, cur = pos, SEEK_SET); if(FTRUNCATE64_(handle, pos) < 0) SetLastError(); } if(LSEEK64_(handle, cur, SEEK_SET) < 0) SetLastError(); }
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; }
void FileStream::SetPos(int64 pos) { ASSERT(IsOpen()); if(LSEEK64_(handle, pos, SEEK_SET) < 0) SetLastError(); }