virtual bool Visit(const TCHAR* FilenameOrDirectory, const FFileStatData& StatData) override { bool Result = true; if (!StatData.bIsDirectory && IsPackageFilename(FilenameOrDirectory)) { Result = Callback(FilenameOrDirectory, StatData); } return Result; }
virtual bool Visit(const TCHAR* FilenameOrDirectory, bool bIsDirectory) override { bool Result = true; if (!bIsDirectory && IsPackageFilename(FilenameOrDirectory)) { Result = Callback(FilenameOrDirectory); } return Result; }
bool FPackageName::FindPackagesInDirectory( TArray<FString>& OutPackages, const FString& RootDir ) { // Find all files in RootDir, then filter by extension (we have two package extensions so they can't // be included in the search wildcard. TArray<FString> AllFiles; IFileManager::Get().FindFilesRecursive(AllFiles, *RootDir, TEXT("*.*"), true, false); // Keep track if any package has been found. Can't rely only on OutPackages.Num() > 0 as it may not be empty. const int32 PreviousPackagesCount = OutPackages.Num(); for (int32 FileIndex = 0; FileIndex < AllFiles.Num(); FileIndex++) { FString& Filename = AllFiles[FileIndex]; if (IsPackageFilename(Filename)) { OutPackages.Add(Filename); } } return OutPackages.Num() > PreviousPackagesCount; }
bool FPackageName::SearchForPackageOnDisk(const FString& PackageName, FString* OutLongPackageName, FString* OutFilename, bool bUseLocalizedNames) { bool bResult = false; double StartTime = FPlatformTime::Seconds(); if (FPackageName::IsShortPackageName(PackageName) == false) { // If this is long package name, revert to using DoesPackageExist because it's a lot faster. FString Filename; if (DoesPackageExist(PackageName, NULL, &Filename)) { if (OutLongPackageName) { *OutLongPackageName = PackageName; } if (OutFilename) { *OutFilename = Filename; } bResult = true; } } else { // Attempt to find package by its short name by searching in the known content paths. TArray<FString> Paths; { TArray<FString> RootContentPaths; FPackageName::QueryRootContentPaths( RootContentPaths ); for( TArray<FString>::TConstIterator RootPathIt( RootContentPaths ); RootPathIt; ++RootPathIt ) { const FString& RootPath = *RootPathIt; const FString& ContentFolder = FPackageName::LongPackageNameToFilename( RootPath ); Paths.Add( ContentFolder ); } } const FString PackageWildcard = (PackageName.Find(TEXT(".")) != INDEX_NONE ? PackageName : PackageName + TEXT(".*")); TArray<FString> Results; for (int32 PathIndex = 0; PathIndex < Paths.Num() && !bResult; ++PathIndex) { // Search directly on disk. Very slow! IFileManager::Get().FindFilesRecursive(Results, *Paths[PathIndex], *PackageWildcard, true, false); for (int32 FileIndex = 0; FileIndex < Results.Num(); ++FileIndex) { FString Filename(Results[FileIndex]); if (IsPackageFilename(Results[FileIndex])) { // Convert to long package name. FString LongPackageName; if (TryConvertFilenameToLongPackageName(Filename, LongPackageName)) { if (OutLongPackageName) { if (bResult) { UE_LOG(LogPackageName, Warning, TEXT("Found ambiguous long package name for '%s'. Returning '%s', but could also be '%s'."), *PackageName, **OutLongPackageName, *LongPackageName ); } else { *OutLongPackageName = LongPackageName; } } if (OutFilename) { FPaths::MakeStandardFilename(Filename); if (bResult) { UE_LOG(LogPackageName, Warning, TEXT("Found ambiguous file name for '%s'. Returning '%s', but could also be '%s'."), *PackageName, **OutFilename, *Filename); } else { *OutFilename = Filename; } } bResult = true; } } } } } float ThisTime = FPlatformTime::Seconds() - StartTime; UE_LOG(LogPackageName, Log, TEXT("SearchForPackageOnDisk took %7.3fs to resolve %s"), ThisTime, *PackageName); return bResult; }