예제 #1
0
OFF_T get_file_size(char *device) {
	OFF_T size = 0;
	fd_t fd;

#ifdef WINDOWS
	SetLastError(0);

	fd = CreateFile(device,
		GENERIC_READ,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		0,
		NULL);
#else
	fd = open(device, 0);
#endif

	if (INVALID_FD(fd)) {
		return size;
	}

	size = SeekEnd(fd);
	size /= BLK_SIZE;

	CLOSE(fd);
	return size;
}
예제 #2
0
uint64 File::Length () const
{
    if_debug (ValidateState());

    // BSD does not support seeking to the end of a device
#ifdef TC_BSD
    if (Path.IsBlockDevice() || Path.IsCharacterDevice())
    {
#	ifdef TC_MACOSX
        uint32 blockSize;
        uint64 blockCount;
        throw_sys_sub_if (ioctl (FileHandle, DKIOCGETBLOCKSIZE, &blockSize) == -1, wstring (Path));
        throw_sys_sub_if (ioctl (FileHandle, DKIOCGETBLOCKCOUNT, &blockCount) == -1, wstring (Path));
        return blockCount * blockSize;
#	else
        uint64 mediaSize;
        throw_sys_sub_if (ioctl (FileHandle, DIOCGMEDIASIZE, &mediaSize) == -1, wstring (Path));
        return mediaSize;
#	endif
    }
#endif
    off_t current = lseek (FileHandle, 0, SEEK_CUR);
    throw_sys_sub_if (current == -1, wstring (Path));
    SeekEnd (0);
    uint64 length = lseek (FileHandle, 0, SEEK_CUR);
    SeekAt (current);
    return length;
}
예제 #3
0
/// Gets the length of the file
u64 YCFile::GetLength()
{
	const u64 current_offset = GetPosition();
	const u64 end_offset     = SeekEnd();

	SeekHed(current_offset);

	return end_offset;
}
예제 #4
0
bool FileIntf::Impl::Append(BlockHandle fileHeader, const char* buff, size_t buffSize)
{
	if (IsEmpty(fileHeader))
	{
		return AppendImpl(fileHeader, buff, buffSize);
	}
	FilePos pos = {0};
	SeekEnd(fileHeader, pos);
	return AppendImpl(pos, buff, buffSize);
}
예제 #5
0
void BlockStream::OpenInit(dword mode, int64 _filesize) {
	streamsize = _filesize;
	style = STRM_READ|STRM_SEEK;
	SetLoading();
	mode &= ~SHAREMASK;
	if(mode != READ) {
		style |= STRM_WRITE;
		SetStoring();
	}
	rdlim = wrlim = ptr = buffer;
	pos = 0;
	pagepos = -1;
	pagedirty = false;
	if(!buffer)
		SetBufferSize(4096);
	if(mode == APPEND) SeekEnd();
}
예제 #6
0
bool File::Initialize(string path, FILE_OPEN_MODE mode) {
	Close();
	_path = path;
	string openMode = "";
	switch (mode) {
		case FILE_OPEN_MODE_READ:
		{
			openMode = "rb";
			break;
		}
		case FILE_OPEN_MODE_TRUNCATE:
		{
			openMode = "w+b";
			break;
		}
		case FILE_OPEN_MODE_APPEND:
		{
			openMode = "a+b";
			break;
		}
		default:
		{
			FATAL("Invalid open mode");
			return false;
		}
	}

	_pFile = fopen(STR(_path), STR(openMode));

	if (_pFile == NULL) {
		int err = errno;
		FATAL("Unable to open file %s with mode `%s`. Error was: %s (%d)",
				STR(_path), STR(openMode), strerror(err), err);
		return false;
	}

	if (!SeekEnd())
		return false;

	_size = ftell64(_pFile);

	if (!SeekBegin())
		return false;

	return true;
}
예제 #7
0
void CSheduleServerLog::ConstructL(const TDesC& aLogFileName)
	{
	// Literal constants
	_LIT(KScheduleServerLoggingDirectoryE, "E:\\Logs\\SchSvr\\");
	_LIT(KScheduleServerLoggingDirectoryD, "D:\\Logs\\SchSvr\\");
	_LIT(KScheduleServerLoggingDirectory, "_:\\Logs\\SchSvr\\");
		
	User::LeaveIfError(iFs.Connect());
	TFileName logFile;

	// Log to drive D if possible
	TInt error = iFs.MkDirAll(KScheduleServerLoggingDirectoryE);
	if	(error == KErrAlreadyExists || error == KErrNone)
		{
		logFile.Append(KScheduleServerLoggingDirectoryE);
		}
	else
		{
		error = iFs.MkDirAll(KScheduleServerLoggingDirectoryD);
		if	(error == KErrAlreadyExists || error == KErrNone)
			{
			logFile.Append(KScheduleServerLoggingDirectoryD);
			}
		else
			{
			// system drive directory
			TBuf<15> loggingDirOnSysDrive(KScheduleServerLoggingDirectory);
			loggingDirOnSysDrive[0] = 'A' + static_cast<TInt>(RFs::GetSystemDrive());
			
			error = iFs.MkDirAll(loggingDirOnSysDrive);
			if	(error != KErrAlreadyExists && error < KErrNone)
				User::Leave(error);
			logFile.Append(loggingDirOnSysDrive);
			}
		}

	// Open log file
	TParsePtrC parser(aLogFileName);
	logFile.Append(parser.Name());

#ifdef __WINS__
	logFile.Append(_L(".WINS"));
#elif __MARM__
	logFile.Append(_L(".MARM"));
#endif
#ifdef _DEBUG
	logFile.Append(_L(".UDEB"));
#else
	logFile.Append(_L(".UREL"));
#endif
	logFile.Append(parser.Ext());
	logFile.Append(_L(".TXT"));

	User::LeaveIfError(iFile.Replace(iFs, logFile, EFileStreamText | EFileShareAny));
	SeekEnd();

	NewLine();
	NewLine();
	_LIT(KNewLogEntry, "=== NEW LOG ===");
	Write(KNewLogEntry);
	NewLine();
	}