Files
FC1/Cry3DEngine/File.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

315 lines
6.6 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2002.
// -------------------------------------------------------------------------
// File name: file.cpp
// Version: v1.00
// Created: 28/5/2001 by Vladimir Kajalin
// Compilers: Visual Studio.NET
// Description: ceached file access
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#if defined(LINUX)
#include <sys/io.h>
#else
#include <io.h>
#endif
#ifndef _XBOX
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#endif
#else
#include <xtl.h>
#endif
#include "File.h"
#include "ICryPak.h"
ICryPak * CXFile::m_pCryPak = 0;
//////////////////////////////////////////////////////////////////////
CXFile::CXFile(struct ICryPak * pCryPak)
{
m_pCryPak = pCryPak;
m_szFileStart=NULL;
m_nFileSize=0;
m_pCurrPos=0;
m_pEndOfFile=NULL;
m_sLoadedFileName[0]=0;
}
//////////////////////////////////////////////////////////////////////
int CXFile::FRead(void *pDest,int nSize,int nNumElems)
{
int nTotSize=nSize*nNumElems;
char *pTest=m_pCurrPos+nTotSize;
if (pTest>m_pEndOfFile)
return (0);
memcpy(pDest,m_pCurrPos,nTotSize);
m_pCurrPos+=nTotSize;
return (nNumElems);
}
//////////////////////////////////////////////////////////////////////
int CXFile::FSeek(int nOff,int nFrom)
{
if (nFrom==SEEK_SET)
{
m_pCurrPos=m_szFileStart+nOff;
if (m_pCurrPos>m_pEndOfFile)
return (1);
}
return (0);
}
//////////////////////////////////////////////////////////////////////
void CXFile::FClose()
{
if (m_szFileStart)
{
delete [] m_szFileStart;
m_szFileStart=NULL;
}
m_pCurrPos=NULL;
m_nFileSize=0;
m_pEndOfFile=NULL;
m_sLoadedFileName[0]=0;
}
//////////////////////////////////////////////////////////////////////
int CXFile::FLoad(const char * filename)
{
if(!m_szFileStart || strcmp(m_sLoadedFileName,filename)!=0)
{
FClose();
m_nFileSize=LoadInMemory(filename,(void**)&m_szFileStart);
strncpy(m_sLoadedFileName,filename,sizeof(m_sLoadedFileName));
}
m_pCurrPos=m_szFileStart;
m_pEndOfFile=m_szFileStart+m_nFileSize;
return (m_nFileSize);
}
//get filename's extension
//////////////////////////////////////////////////////////////////////
char *CXFile::GetExtension(const char *filename)
{
char *src = (char *)filename+strlen(filename)-1;
while (*src)
{
if (*src == '.')
{
return (++src);
}
src--;
}
return (NULL);
}
//remove extension from filename
//////////////////////////////////////////////////////////////////////
void CXFile::RemoveExtension(char *path)
{
char *src = path+strlen(path)-1;
while (*src)
{
if (*src == '.')
{
*src = 0; // remove extension
return;
}
src--;
}
}
//replace filename extension
//////////////////////////////////////////////////////////////////////
void CXFile::ReplaceExtension(char *path, const char *new_ext)
{
RemoveExtension(path);
strcat(path,".");
strcat(path,new_ext);
}
//check if file exist
//////////////////////////////////////////////////////////////////////
bool CXFile::IsFileExist(const char *filename)
{
return FileExist(filename);
}
//check if file exist
//////////////////////////////////////////////////////////////////////
bool CXFile::FileExist(const char *filename)
{
FILE * fp = m_pCryPak->FOpen(filename,"rb");
if (!fp)
return (false);
m_pCryPak->FClose(fp);
return (true);
}
//get length of the file
//return (-1) if error
//////////////////////////////////////////////////////////////////////
int CXFile::GetLength(const char *filename)
{
FILE * fp = m_pCryPak->FOpen(filename,"rb");
if (!fp)
return (-1);
int pos;
int end;
pos = m_pCryPak->FTell(fp);
m_pCryPak->FSeek(fp, 0, SEEK_END);
end = m_pCryPak->FTell(fp);
m_pCryPak->FSeek(fp, pos, SEEK_SET);
m_pCryPak->FClose(fp);
return (end);
}
//tell if filename1 is older than masterfile
//////////////////////////////////////////////////////////////////////
/*bool CXFile::IsOutOfDate(const char *pFileName1,const char *pMasterFile)
{
FILE * f = m_pCryPak->FOpen(pMasterFile,"rb");
if (f)
m_pCryPak->FClose(f);
else
return (false);
f = m_pCryPak->FOpen(pFileName1,"rb");
if (f)
m_pCryPak->FClose(f);
else
return (true);
#ifdef WIN32
HANDLE status1 = CreateFile(pFileName1,GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
HANDLE status2 = CreateFile(pMasterFile,GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
FILETIME writetime1,writetime2;
GetFileTime(status1,NULL,NULL,&writetime1);
GetFileTime(status2,NULL,NULL,&writetime2);
CloseHandle(status1);
CloseHandle(status2);
if (CompareFileTime(&writetime1,&writetime2)==-1)
return(true);
return (false);
#else
return (false);
#endif
}*/
//////////////////////////////////////////////////////////////////////
/*int CXFile::GetWriteTime(const char *pFileName1)
{
FILE * f = m_pCryPak->FOpen(pFileName1,"rb");
if (f)
m_pCryPak->FClose(f);
else
return (0);
#ifdef WIN32
HANDLE status1 = CreateFile(pFileName1,GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
FILETIME writetime1;
memset(&writetime1,0,sizeof(writetime1));
GetFileTime(status1,NULL,NULL,&writetime1);
CloseHandle(status1);
return (writetime1.dwHighDateTime + writetime1.dwLowDateTime);
#else
return (0);
#endif
} */
//////////////////////////////////////////////////////////////////////
int CXFile::GetLength(FILE *f)
{
int pos;
int end;
pos = m_pCryPak->FTell(f);
m_pCryPak->FSeek(f, 0, SEEK_END);
end = m_pCryPak->FTell(f);
m_pCryPak->FSeek(f, pos, SEEK_SET);
return end;
}
//////////////////////////////////////////////////////////////////////
void CXFile::SafeRead(FILE *f, void *buffer, int count)
{
(m_pCryPak->FRead(buffer, 1, count, f) != (unsigned)count);
}
//////////////////////////////////////////////////////////////////////
int CXFile::LoadInMemory(const char *filename, void **bufferptr)
{
FILE *f = m_pCryPak->FOpen(filename,"rb");
if (!f)
return (0);
int length = CXFile::GetLength(f);
void *buffer = new char[length+1];
SafeRead(f, buffer, length);
m_pCryPak->FClose(f);
char * bbp = (char *)buffer;
bbp[length] = 0; //null terminated
*bufferptr = buffer;
return (length);
}
//////////////////////////////////////////////////////////////////////
void CXFile::GetPath(char *path)
{
char *src = path+strlen(path)-1;
while (*src)
{
if (*src == '\\')
{
src++;
*src = 0; // remove extension
return;
}
src--;
}
}