#include #include #include #include PathFind::PathFind(void) : mIsOkay(FALSE) { mUpDirString=".."; mCurrDirString="."; mBackSlashString="\\"; mStarDotStarString="*.*"; mPathString="PATH"; mSemicolonString=";"; mWinDirString="windir"; getPathBlock(); } PathFind::~PathFind() { } WORD PathFind::isFile(const String &pathFileName) { return mFindData.findFirst(pathFileName); } BOOL PathFind::hasWildCard(String &pathFileSpec)const { if(-1==pathFileSpec.strpos("*")&&-1==pathFileSpec.strpos("?"))return FALSE; return TRUE; } BOOL PathFind::hasPath(String &pathFileSpec)const { if(-1==pathFileSpec.strpos(":"))return FALSE; return TRUE; } WORD PathFind::dirList(String pathEntry,Block &subDirList) { subDirList.remove(); if(pathEntry.isNull())getWinDir(pathEntry); if(pathEntry.strstr("*"))getDirEntries(pathEntry,subDirList); else getPathTranscend(pathEntry,subDirList); return subDirList.size(); } WORD PathFind::fileList(String pathFileSpec,Block &entryList) { int strLength(pathFileSpec.length()); entryList.remove(); if(pathFileSpec.isNull())return FALSE; if(!hasPath(pathFileSpec))insertPath(pathFileSpec); if(!hasWildCard(pathFileSpec)) { if(pathFileSpec.operator[](strLength-1)=='\\'||pathFileSpec.operator[](strLength-1)=='/')pathFileSpec+=mStarDotStarString; else pathFileSpec+=mBackSlashString+mStarDotStarString; } if(!mFindData.findFirst(pathFileSpec,FindData::FileArchive))return FALSE; if(mFindData.attributes()&FindData::FileArchive)entryList.insert(&mFindData.fileName()); while(mFindData.findNext())if(mFindData.attributes()&FindData::FileArchive)entryList.insert(&mFindData.fileName()); return (entryList.size()?TRUE:FALSE); } WORD PathFind::findFile(const String &pureFileName,String &pathFileName) { String searchDir; if(!mIsOkay)return FALSE; if(pureFileName.isNull())return FALSE; if(isFile(pureFileName)) { pathFileName=pureFileName; return TRUE; } size_t numEntries((size_t)mPathEntry.size()); for(int itemIndex=0;itemIndex subDirList; String searchFileName; String transcendPath; if(pathEntry.isNull())return FALSE; fixupPathName(pathEntry); searchFileName=pathEntry; searchFileName+=pureFileName; if(isFile(searchFileName)){pathFileName=searchFileName;return TRUE;} return FALSE; } WORD PathFind::searchPathTranscend(String pathEntry,String pureFileName,String &pathFileName) { if(pathEntry.isNull())return FALSE; Block subDirList; String searchFileName; String transcendPath; if(pathEntry.isNull())return FALSE; if(!canTranscend(pathEntry)) { searchFileName=pathEntry; searchFileName+=mBackSlashString; searchFileName+=pureFileName; if(isFile(searchFileName)){pathFileName=searchFileName;return TRUE;} return FALSE; } searchFileName=pathEntry; searchFileName+=mBackSlashString; searchFileName+=pureFileName; if(isFile(searchFileName)){pathFileName=searchFileName;return TRUE;} subList(subDirList,pathEntry); WORD itemCount((size_t)subDirList.size()); for(int itemIndex=0;itemIndex &pathFileName) { if(pathEntry.isNull())return FALSE; Block subDirList; String searchFileName; String transcendPath; String pathEntryExtension; if(pathEntry.isNull())return FALSE; if(!canTranscend(pathEntry)) { searchFileName=pathEntry; searchFileName+=mBackSlashString; searchFileName+=mStarDotStarString; return getDirectoryFileEntries(searchFileName,pathFileName); } searchFileName=pathEntry; searchFileName+=mBackSlashString; searchFileName+=mStarDotStarString; getDirectoryFileEntries(searchFileName,pathFileName); subList(subDirList,pathEntry); WORD itemCount((size_t)subDirList.size()); for(int itemIndex=0;itemIndex &entryStrings) { Profile iniProfile; WORD specEntries(0); String pathEntrySpec; String pathFileName; if(pathEntryFileSpec.isNull())return specEntries; pathEntrySpec=pathEntryFileSpec; iniProfile.makeDirectoryName(pathEntrySpec); pathEntrySpec+=mBackSlashString; if(mFindData.findFirst(pathEntryFileSpec)) { pathFileName=pathEntrySpec; pathFileName+=mFindData.fileName(); pathFileName.lower(); entryStrings.insert(&pathFileName); specEntries++; while(mFindData.findNext()) { pathFileName=pathEntrySpec; pathFileName+=mFindData.fileName(); pathFileName.lower(); entryStrings.insert(&pathFileName); specEntries++; } } return specEntries; } WORD PathFind::getDirEntries(String pathEntryFileSpec,Block &entryStrings) { Profile iniProfile; WORD specEntries(0); String pathFileName; String dirName; FindData findData; if(pathEntryFileSpec.isNull())return specEntries; dirName=pathEntryFileSpec; if(!iniProfile.makeDirectoryName(dirName))dirName=String(); if(!findData.findFirst(pathEntryFileSpec)) { pathFileName=dirName; if(!pathFileName.isNull())pathFileName+="/"; pathFileName+=findData.fileName(); pathFileName.lower(); entryStrings.insert(&pathFileName); specEntries++; while(!findData.findNext()) { pathFileName=dirName; if(!pathFileName.isNull())pathFileName+="/"; pathFileName+=findData.fileName(); pathFileName.lower(); entryStrings.insert(&pathFileName); specEntries++; } } return specEntries; } void PathFind::subList(Block &subDirList,String pathEntry) { subDirList.remove(); String entryString; pathEntry+=mBackSlashString; pathEntry+=mStarDotStarString; if(mFindData.findFirst(pathEntry,FindData::FileDirectory)) { entryString=mFindData.fileName(); if(isDirectory(mFindData)){entryString.lower();subDirList.insert(&entryString);} while(mFindData.findNext()) { entryString=mFindData.fileName(); if(isDirectory(mFindData)){entryString.lower();subDirList.insert(&entryString);} } } } WORD PathFind::canTranscend(String &pathEntry) { FindData findData; char *lpStr; if(!findData.findFirst(pathEntry)||findData.attributes()&FindData::FileDirectory) { String tempString(pathEntry); if(*((char*)tempString+tempString.length())!=BackSlash&&*((char*)tempString+tempString.length())!=ForwardSlash)tempString+=mBackSlashString; tempString+=mStarDotStarString; if(mFindData.findFirst(tempString,FindData::FileDirectory)) { if(isDirectory(mFindData))return TRUE; while(mFindData.findNext())if(isDirectory(mFindData))return TRUE; } return FALSE; } lpStr=::strchr(pathEntry,Dot); *lpStr=BackSlash; return FALSE; } void PathFind::fixupPathName(String &pathEntry) { char *lpStr; if(0==(lpStr=::strchr(pathEntry,Dot))) { if(*((char*)pathEntry+pathEntry.length())!=BackSlash&&*((char*)pathEntry+pathEntry.length())!=ForwardSlash)pathEntry+=mBackSlashString; return; } *lpStr=BackSlash; return; } void PathFind::insertPath(String &pathFileSpec)const { String currentDirectory; DiskInfo diskInfo; diskInfo.getCurrentDirectory(currentDirectory); currentDirectory+=mBackSlashString; pathFileSpec.insert(currentDirectory); } WORD PathFind::isDirectory(FindData &findData) { String tempString; if(FindData::FileDirectory&findData.attributes()) { tempString=findData.fileName(); if(!(tempString==mUpDirString)&&!(tempString==mCurrDirString))return TRUE; } return FALSE; } WORD PathFind::getPathBlock(void) { String strCopyPath; char *lpPath; char *lpTemp; strCopyPath=::getenv((LPSTR)mPathString); if(strCopyPath.isNull())return FALSE; lpPath=(char*)strCopyPath; if(0==(lpTemp=::strtok(lpPath,mSemicolonString)))return FALSE; mPathEntry.remove(); while(TRUE) { mPathEntry.insert(&String(lpTemp)); if(0==(lpTemp=::strtok(0,mSemicolonString)))break; } return (mIsOkay=TRUE); } WORD PathFind::getWinDir(String &winDirString) { char *lpPath; if(0==(lpPath=::getenv((LPSTR)mWinDirString))) { mWinDirString.upper(); if(0==(lpPath=::getenv((LPSTR)mWinDirString)))return FALSE; mWinDirString.lower(); } winDirString=lpPath; return TRUE; } WORD PathFind::getCurrDir(String &currDirString) { DiskInfo diskInfo; return diskInfo.getCurrentDirectory(currDirString); } WORD PathFind::getWindowsDirectory(String &windowsDirectoryString) { String windowsDirString; if(FALSE==(::GetWindowsDirectory(windowsDirString,String::MaxString)))return FALSE; windowsDirectoryString=windowsDirString; return TRUE; } WORD PathFind::getSystemDirectory(String &systemDirectoryString) { String systemDirString; if(FALSE==(::GetSystemDirectory(systemDirString,String::MaxString)))return FALSE; systemDirectoryString=systemDirString; return TRUE; } BOOL PathFind::getWindowsTempDirectory(String &windowsTempDirectory) { String windowsTempDir; if(FALSE==(::GetTempPath(String::MaxString,(char*)windowsTempDir)))return FALSE; windowsTempDirectory=windowsTempDir; return TRUE; } BOOL PathFind::getTempFileName(String &strPathTempFileName,const String &strPrefix) { String strPathTempDir; getWindowsTempDirectory(strPathTempDir); strPathTempFileName=::_tempnam(strPathTempDir,strPrefix.isNull()?0:(char*)(String&)strPrefix); return !(strPathTempFileName.isNull()); }