filespecutils.cpp

来自「symbian 下的helix player源代码」· C++ 代码 · 共 724 行 · 第 1/2 页

CPP
724
字号
	}

	if ( 0 == ::FindNextFile( hFile, &findFileData ) )
	{
	    if ( ERROR_NO_MORE_FILES != GetLastError() )
	    {
		fSize = 0;
		outResult = HXR_FAIL;
	    }

	    break;
	}
    }

    ::FindClose( hFile );
    return HXR_OK;
}

//******************************************************************************
CHXFileSpecifier CHXFileSpecUtils::GetCurrentApplication(void)
{
	CHXFileSpecifier spec;
	char szBuf[_MAX_PATH]; /* Flawfinder: ignore */

	if (GetModuleFileName(NULL,OS_STRING2(szBuf,_MAX_PATH),_MAX_PATH))
	{
		spec = CHXFileSpecifier(szBuf); 
	}

	return spec;
}

//******************************************************************************
CHXDirSpecifier CHXFileSpecUtils::GetCurrentApplicationDir(void)
{
	CHXFileSpecifier 	appSpec;
	CHXDirSpecifier 	dirSpec;
	
	appSpec = GetCurrentApplication();
	if (appSpec.IsSet())
	{
		dirSpec = appSpec.GetParentDirectory();
	}
	return dirSpec;
}

//******************************************************************************
BOOL CHXFileSpecUtils::FileExists(const CHXFileSpecifier& fileSpec)
{
    BOOL bRet = FALSE;

    //struct stat statBuff;
    //ZeroInit(&statBuff);

    //if ( (stat(fileSpec.GetPathName(), &statBuff) == 0) && (statBuff.st_mode & _S_IFREG))
    //bRet = TRUE;

    ULONG32 ulAtts = ::GetFileAttributes(OS_STRING(fileSpec.GetPathName()));

    if (ulAtts != 0xFFFFFFFF && !(ulAtts & FILE_ATTRIBUTE_DIRECTORY))
	bRet = TRUE;

    return bRet;
}

//******************************************************************************
BOOL CHXFileSpecUtils::DirectoryExists(const CHXDirSpecifier& dirSpec)
{
	ULONG32 ulAtts = ::GetFileAttributes(OS_STRING(dirSpec.GetPathName()));

	if (ulAtts != 0xFFFFFFFF && (ulAtts & FILE_ATTRIBUTE_DIRECTORY))
		return TRUE;

	return FALSE;
}

//******************************************************************************
HX_RESULT CHXFileSpecUtils::CreateDir(const CHXDirSpecifier& dirSpec)
{
        if (::CreateDirectory(OS_STRING(dirSpec.GetPathName()),NULL))
		return TRUE;

	return FALSE;
}

//******************************************************************************
static CHXFileSpecifier GetUniqueFileSpecInternal(const CHXDirSpecifier& locationSpec, 
									const char *pszNameFirst, const char *pszTemplate, 
									const char *pszWildcard, UINT32 nStartNum);
									
const UINT32 kNumWrapValue = 9999+1;	// limit insertions to 4-digit numbers
	
CHXFileSpecifier CHXFileSpecUtils::GetUniqueFileSpec(const CHXDirSpecifier& locationSpec, 
									const char *pszNameFirst, const char *pszTemplate, 
									const char *pszWildcard)
{
	return GetUniqueFileSpecInternal(locationSpec, pszNameFirst, pszTemplate, pszWildcard, 0);
}

CHXFileSpecifier CHXFileSpecUtils::GetUniqueTempFileSpec(const CHXDirSpecifier& locationSpec, 
									const char *pszTemplate, const char *pszWildcard)
{
	CMultiplePrimeRandom 	rand(HX_GET_TICKCOUNT());
	
	UINT32 num;
	
	num = rand.GetRandomNumber();
	
	num %= kNumWrapValue;
	
	if (num == 0 || num == 1) num = 2;

	return GetUniqueFileSpecInternal(locationSpec, NULL, pszTemplate, pszWildcard, num);
}

static CHXFileSpecifier GetUniqueFileSpecInternal(const CHXDirSpecifier& locationSpec, 
									const char *pszNameFirst, const char *pszTemplate, 
									const char *pszWildcard, UINT32 nStartNum)
{
	CHXFileSpecifier 		resultFileSpec;
	
	require_return(locationSpec.IsSet(), resultFileSpec);
	require_return(pszTemplate != NULL && pszWildcard != NULL, resultFileSpec);
	require_return(pszNameFirst != NULL || nStartNum != 0, resultFileSpec);
	
	CHXFileSpecifier 	testFileSpec;
	CHXDirSpecifier 	testDirSpec;
	CHXString			strNumber;
	CHXString			strName;
	UINT32				nCurrentNum;
	
	nCurrentNum = nStartNum;

	while (1) 
	{
		// if the number is non-zero, make a string from the template;
		// if the number is zero, user the initial name string
		if (nCurrentNum == 0)
		{
			// replace the wildcard in the template with the number string
			strName = pszNameFirst;
		}
		else
		{
			// replace the wildcard in the template with the number string
			strNumber.Empty();
			strNumber.AppendULONG(nCurrentNum);

			strName = pszTemplate;
			strName.FindAndReplace(pszWildcard, strNumber);	// replace first wildcard with number string
		}
		
		
		// test if a file or directory exists with that name
		testFileSpec = locationSpec.SpecifyChildFile(strName);
		testDirSpec = locationSpec.SpecifyChildDirectory(strName);
		if (CHXFileSpecUtils::FileExists(testFileSpec)
			|| CHXFileSpecUtils::DirectoryExists(testDirSpec))
		{
			// an item already has that name, so increment & wrap the number
			nCurrentNum++;
			nCurrentNum %= kNumWrapValue;
			
			// don't use 0 again, and skip 1 since "MyFile2.txt" logically follows "MyFile.txt"
			if (nCurrentNum == 0 || nCurrentNum == 1) 
			{
				nCurrentNum = 2; 
			}
			
			// a quick sanity check
			if (nCurrentNum == nStartNum)
			{
				check(!"GetUniqueFileSpecInternal number wrapped");
				break;
			}
		}
		else
		{
			// the name is unique
			resultFileSpec = testFileSpec;
			break;
		}
		
	} // while

	return resultFileSpec;
}
//******************************************************************************
CHXDirSpecifier CHXFileSpecUtils::GetSystemTempDirectory()
{
	char szBuf[MAX_PATH] = ""; /* Flawfinder: ignore */

#if !defined(WIN32_PLATFORM_PSPC)
	::GetTempPath(MAX_PATH,szBuf);
#endif /* !defined(WIN32_PLATFORM_PSPC) */

	CHXDirSpecifier retSpec(szBuf);
	return retSpec;
}




BOOL CHXFileSpecUtils::MakeNameLegal(char *pszName)
{
	const char *badChars = "\\/:*?\"<>|";
	const char replacementChar = '-';
	const long maxNameLength = 255;
	char *pCurrChar = pszName;

	BOOL bChanged;
	
	require_nonnull_return(pszName, FALSE);
	
	bChanged = FALSE;

	// replace any illegal characters
	while (*pCurrChar)
	{
		if (strchr(badChars, *pCurrChar))
		{
			*pCurrChar = replacementChar;
			bChanged = TRUE;
		}
		pCurrChar = HXGetNextChar(pCurrChar);

		// be sure the name isn't too long
		if (pCurrChar - pszName >= maxNameLength)
		{
			if (pCurrChar - pszName >= maxNameLength + 1)
				pCurrChar = HXGetPrevChar(pszName, pCurrChar);
			*pCurrChar = 0;
			bChanged = TRUE;
		}
	}
	
	return bChanged;
}

//******************************************************************************
CHXDirSpecifier 
CHXFileSpecUtils::GetAppDataDir(const char* szAppName)
{
    CHXDirSpecifier dirResult;

    CHXString strPath;

    HINSTANCE hShell = ::LoadLibrary(OS_STRING("shell32.dll"));
    FPSHGetSpecialFolderLocation fpSHGetSpecialFolderLocation = NULL;
    FPSHGetPathFromIDList fpSHGetPathFromIDList = NULL;
    FPSHGetMalloc fpSHGetMalloc = NULL;
    if (hShell)
    {
	fpSHGetSpecialFolderLocation = (FPSHGetSpecialFolderLocation) GetProcAddress(hShell,OS_STRING("SHGetSpecialFolderLocation"));
	fpSHGetPathFromIDList = (FPSHGetPathFromIDList) GetProcAddress(hShell, OS_STRING("SHGetPathFromIDListA"));
	// just in case
	if (!fpSHGetPathFromIDList)
	{
	    fpSHGetPathFromIDList = (FPSHGetPathFromIDList) GetProcAddress(hShell, OS_STRING("SHGetPathFromIDList"));
	}
	fpSHGetMalloc = (FPSHGetMalloc) GetProcAddress(hShell, OS_STRING("SHGetMalloc"));
    }

    if (!fpSHGetSpecialFolderLocation	||
	!fpSHGetPathFromIDList		||
	!fpSHGetMalloc)
    {
	goto exit;
    }

#if !defined(WIN32_PLATFORM_PSPC)
    ITEMIDLIST* pidl;
    pidl = NULL;
    if(fpSHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl) == NOERROR)
    {
	HX_ASSERT(pidl);
	fpSHGetPathFromIDList(pidl, strPath.GetBuffer(_MAX_PATH + 1));
	
	IMalloc* pMalloc = NULL;
	if (SUCCEEDED(fpSHGetMalloc(&pMalloc)))
	{
	    pMalloc->Free(pidl);
	    pMalloc->Release();
	    pMalloc = NULL;
	    pidl = NULL;
	}

	strPath.ReleaseBuffer();
    }
    else
    {
	// In Win95 OSR2 SHGetSpecialFolderLocation() fails on CSIDL_APPDATA.
	HKEY hKey = NULL;
	if(RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion", &hKey) == ERROR_SUCCESS)
	{
	    DWORD nValueType = REG_NONE;
	    DWORD bufSize = _MAX_PATH;
	    RegQueryValueEx(hKey, OS_STRING("ProgramFilesDir"), 
			    NULL, &nValueType, 
			    (Byte *)strPath.GetBuffer(_MAX_PATH + 1), 
			    &bufSize);
	    strPath.ReleaseBuffer();
	    RegCloseKey(hKey);
	}
    }
#endif /* !defined(WIN32_PLATFORM_PSPC) */

    if(!strPath.IsEmpty())
    {
	dirResult = strPath;
	if(!DirectoryExists(dirResult))
	    CreateDir(dirResult);

	dirResult = dirResult.SpecifyChildDirectory("Real");
	if(!DirectoryExists(dirResult))
	    CreateDir(dirResult);

	if(szAppName)
	{
	    dirResult = dirResult.SpecifyChildDirectory(szAppName);
	    if(!DirectoryExists(dirResult))
		CreateDir(dirResult);
	}
    }

exit:
    if (hShell)
    {
	::FreeLibrary(hShell);
    }

    return dirResult;
}

//******************************************************************************

HX_RESULT CHXFileSpecUtils::ReadBinaryFile(const CHXFileSpecifier& fileSpec, IHXBuffer*& pOutBuffer)
{
	HX_ASSERT(!"Not yet implemented on this platform");
	return HXR_FAIL;
}

HX_RESULT CHXFileSpecUtils::ReadTextFile(const CHXFileSpecifier& fileSpec, CHXString& outStr)
{
	HX_ASSERT(!"Not yet implemented on this platform");
	return HXR_FAIL;
}

HX_RESULT CHXFileSpecUtils::WriteBinaryFile(CHXFileSpecifier& fileSpec, IHXBuffer* inBuffer, BOOL bReplaceExistingFile)
{
	// the first parameter is not const because on the Mac it can change during the call
	HX_ASSERT(!"Not yet implemented on this platform");
	return HXR_FAIL;
}

HX_RESULT CHXFileSpecUtils::WriteTextFile(CHXFileSpecifier& fileSpec, const CHXString& inStr, BOOL bReplaceExistingFile)
{
	// the first parameter is not const because on the Mac it can change during the call
	HX_ASSERT(!"Not yet implemented on this platform");
	return HXR_FAIL;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?