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

100 lines
3.0 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2002.
// -------------------------------------------------------------------------
// File name: fileutil.cpp
// Version: v1.00
// Created: 5/11/2002 by Timur.
// Compilers: Visual Studio.NET
// Description:
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "FileUtil.h"
#include <io.h>
//////////////////////////////////////////////////////////////////////////
// the paths must have trailing slash
static bool ScanDirectoryRecursive( const CString &root,const CString &path,const CString &file,std::vector<CString> &files, bool recursive )
{
__finddata64_t c_file;
intptr_t hFile;
bool anyFound = false;
CString fullPath = root + path + file;
if ( (hFile = _findfirst64( fullPath.GetString(), &c_file )) != -1L )
{
// Find the rest of the files.
do {
if (!(c_file.attrib & _A_SUBDIR))
{
anyFound = true;
files.push_back( path + c_file.name );
}
} while (_findnext64( hFile, &c_file ) == 0);
_findclose( hFile );
}
if (recursive)
{
fullPath = root + path + "*.*";
if( (hFile = _findfirst64( fullPath.GetString(), &c_file )) != -1L )
{
// Find directories.
do {
if (c_file.attrib & _A_SUBDIR)
{
// If recursive.
if (c_file.name[0] != '.')
{
if (ScanDirectoryRecursive( root,path + c_file.name + "\\",file,files,recursive ))
anyFound = true;
}
}
} while (_findnext64( hFile, &c_file ) == 0);
_findclose( hFile );
}
}
return anyFound;
}
//////////////////////////////////////////////////////////////////////////
bool FileUtil::ScanDirectory( const CString &path,const CString &file,std::vector<CString> &files, bool recursive )
{
return ScanDirectoryRecursive(path,"",file,files,recursive );
}
// Magic number explanation:
// Both epochs are Gregorian. 1970 - 1601 = 369. Assuming a leap
// year every four years, 369 / 4 = 92. However, 1700, 1800, and 1900
// were NOT leap years, so 89 leap years, 280 non-leap years.
// 89 * 366 + 280 * 365 = 134744 days between epochs. Of course
// 60 * 60 * 24 = 86400 seconds per day, so 134744 * 86400 =
// 11644473600 = SECS_BETWEEN_EPOCHS.
//
// This result is also confirmed in the MSDN documentation on how
// to convert a time_t value to a win32 FILETIME.
static const __int64 SECS_BETWEEN_EPOCHS = 11644473600;
static const __int64 SECS_TO_100NS = 10000000; /* 10^7 */
// converts the FILETIME to the C Timestamp (compatible with dbghelp.dll)
DWORD FileUtil::FiletimeToUnixTime(const FILETIME& ft)
{
return (DWORD)((((__int64&)ft) / SECS_TO_100NS) - SECS_BETWEEN_EPOCHS);
}
// converts the C Timestamp (compatible with dbghelp.dll) to FILETIME
FILETIME FileUtil::UnixTimeToFiletime(DWORD nCTime)
{
__int64 time = (nCTime + SECS_BETWEEN_EPOCHS) * SECS_TO_100NS;
return (FILETIME&)time;
}