用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
2.8 KiB

5 months ago
#include "PathScanner.h"
#include "FileSys.h"
namespace SevenZip
{
namespace intl
{
void PathScanner::Scan( const TString& root, Callback& cb )
{
Scan( root, _T( "*" ), cb );
}
void PathScanner::Scan( const TString& root, const TString& searchPattern, Callback& cb )
{
std::deque< TString > directories;
directories.push_back( root );
while ( !directories.empty() )
{
TString directory = directories.front();
directories.pop_front();
if ( ExamineFiles( directory, searchPattern, cb ) )
{
break;
}
ExamineDirectories( directory, directories, cb );
}
}
bool PathScanner::ExamineFiles( const TString& directory, const TString& searchPattern, Callback& cb )
{
TString findStr = FileSys::AppendPath( directory, searchPattern );
bool exit = false;
WIN32_FIND_DATA fdata;
HANDLE hFile = FindFirstFile( findStr.c_str(), &fdata );
if ( hFile == INVALID_HANDLE_VALUE )
{
return exit;
}
cb.EnterDirectory( directory );
do
{
FilePathInfo fpInfo = ConvertFindInfo( directory, fdata );
if ( !fpInfo.IsDirectory && !IsSpecialFileName( fpInfo.FileName ) )
{
cb.ExamineFile( fpInfo, exit );
}
}
while ( !exit && FindNextFile( hFile, &fdata ) );
if ( !exit )
{
cb.LeaveDirectory( directory );
}
FindClose( hFile );
return exit;
}
void PathScanner::ExamineDirectories( const TString& directory, std::deque< TString >& subDirs, Callback& cb )
{
TString findStr = FileSys::AppendPath( directory, _T( "*" ) );
WIN32_FIND_DATA fdata;
HANDLE hFile = FindFirstFile( findStr.c_str(), &fdata );
if ( hFile == INVALID_HANDLE_VALUE )
{
return;
}
do
{
FilePathInfo fpInfo = ConvertFindInfo( directory, fdata );
if ( fpInfo.IsDirectory && !IsSpecialFileName( fpInfo.FileName ) && cb.ShouldDescend( fpInfo ) )
{
subDirs.push_back( fpInfo.FilePath );
}
}
while ( FindNextFile( hFile, &fdata ) );
FindClose( hFile );
}
bool PathScanner::IsAllFilesPattern( const TString& searchPattern )
{
return searchPattern == _T( "*" ) || searchPattern == _T( "*.*" );
}
bool PathScanner::IsSpecialFileName( const TString& fileName )
{
return fileName == _T( "." ) || fileName == _T( ".." );
}
bool PathScanner::IsDirectory( const WIN32_FIND_DATA& fdata )
{
return ( fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) != 0;
}
FilePathInfo PathScanner::ConvertFindInfo( const TString& directory, const WIN32_FIND_DATA& fdata )
{
FilePathInfo file;
file.FileName = fdata.cFileName;
file.FilePath = FileSys::AppendPath( directory, file.FileName );
file.LastWriteTime = fdata.ftLastWriteTime;
file.CreationTime = fdata.ftCreationTime;
file.LastAccessTime = fdata.ftLastAccessTime;
file.Attributes = fdata.dwFileAttributes;
file.IsDirectory = IsDirectory( fdata );
ULARGE_INTEGER size;
size.LowPart = fdata.nFileSizeLow;
size.HighPart = fdata.nFileSizeHigh;
file.Size = size.QuadPart;
return file;
}
}
}