SourceForge.jp

dkutilShell.h

説明を見る。
00001 #ifndef _dkutil_Shell__
00002 #define _dkutil_Shell__
00003 
00004 
00018 #include "dkutilStdio.h"
00019 #include "dkutilCommonControl.h"
00020 
00021 #ifdef USE_DKINGYO_SHELL_AND_COMMON_CONTROL
00022 
00023 
00024 
00025 
00026 
00027 
00028 #if DKUTIL_MSVC_MODE
00029 #   pragma comment(lib,"shell32")
00030 #   pragma comment(lib,"shlwapi") 
00031 #endif
00032 
00033 namespace dkutil{
00034 
00035 
00041 extern bool GetDesktopFolder( char *pPath );
00042 
00050 extern bool CreateLinkFile( char *pShortcutFile, char *pDescription, char *pTargetFile );
00051     
00052 
00053 #if 0
00054 
00064 template<class CONTAINER=std::list<WIN32_FIND_DATA> >
00065 class FileFinderBase{
00066 protected:
00067     FileFinderBase(const FileFinderBase&);
00068     FileFinderBase& operator =(const FileFinderBase&);
00069 
00070 
00071     CONTAINER mDataList;
00072     
00073     
00074     std::string mDir;
00075     TCHAR mTmp[MAX_PATH + MAX_PATH];
00076 public:
00077     typedef CONTAINER::iterator iterator;
00078     
00079     FileFinderBase(){
00080         mDir.clear();
00081         mDataList.clear();
00082         
00083         {
00084             char tmp[MAX_PATH];
00085             ::GetCurrentDirectory(sizeof(tmp),tmp);
00086             mDir = tmp;
00087         }
00088         NULL_CHAR_ARRAY(mTmp);
00089     }
00090     virtual ~FileFinderBase(){
00091         Release();
00092     }
00094     void Release(){
00095         mDir.clear();
00096         mDataList.clear();
00097         NULL_CHAR_ARRAY(mTmp);
00098         {
00099             char tmp[MAX_PATH];
00100             ::GetCurrentDirectory(sizeof(tmp),tmp);
00101             mDir = tmp;
00102         }
00103     }
00105     CONTAINER &GetContainer(){return mDataList;}
00107     iterator begin(){return mDataList.begin();}
00109     iterator end(){return mDataList.end();}
00111     void SetDirectory(char *dir){
00112         mDir = dir;
00113     }
00115     const char *GetDirectory()const{return mDir.c_str();}
00121 
00122     int Find(const char *filename,const char *set_directory=NULL){
00123         int result;
00124         bool ChangedDir = false;//Directoryを変更したかどうか?フラグ
00125         result = edk_FAILED;
00126 
00127         //ディレクトリセット
00128         {
00129             {
00130                 int r;
00131                 r = GetCurrentDirectory(sizeof(mTmp),mTmp);
00132                 if(r == 0){
00133                     goto end;
00134                 }
00135             }
00136             //ディレクトリチェンジ
00137             if(set_directory){
00138                 SetCurrentDirectory(set_directory);
00139                 mDir = set_directory;
00140             }else if(!mDir.empty()){
00141                 SetCurrentDirectory(mDir.c_str());
00142             }else{
00143                 //SetCurrentDirectory(mTmp);
00144             }
00145             //フラグ立てとく
00146             ChangedDir = true;
00147         }
00148 
00149         //前検索したリストは削除する
00150         mDataList.clear();
00151 
00152         
00153         result = FindLogic(filename);
00154     end:
00155         //変更したディレクトリは元に戻す
00156         if(ChangedDir){ SetCurrentDirectory(mTmp);}
00157         return result;
00158     }
00159 
00160 private:
00161     bool isFolder(WIN32_FIND_DATA &FindFileData){
00162         return (
00163             FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
00164             && strcmp(FindFileData.cFileName,"..")!=0 
00165             && strcmp(FindFileData.cFileName,".")!=0
00166             );
00167     }
00168     int FindLogic(const char *filename){
00169         int result = edk_FAILED;
00170         //探す
00171         {
00172             char subpath[_MAX_PATH]="";
00173             char temp[_MAX_PATH]="";
00174             dkstrcpy2(temp,sizeof(temp),filename,strlen(filename));
00175             
00176             WIN32_FIND_DATA FindFileData;
00177             HANDLE hFind = FindFirstFile(filename, &FindFileData);
00178             
00179             //temp[strlen(temp)-1]='\0';//*を消している
00180 
00181             if(hFind != INVALID_HANDLE_VALUE){
00182                 do{
00183                     mDataList.push_back(FindFileData);
00184                     if(isFolder(FindFileData))
00185                     {
00186                         dksprintf(subpath,sizeof(subpath),"%s%s\\",temp,FindFileData.cFileName);
00187                         return FindLogic(subpath);
00188                     }
00189 
00190                     if(0==FindNextFile(hFind, &FindFileData)){
00191                         break;
00192                     }
00193                 } while(true);
00194                 FindClose(hFind);
00195                 result = edk_SUCCEEDED;
00196             }
00197             else{
00198                 VISUAL_LASTERROR();
00199             }
00200         }
00201         return result;
00202     }
00203 public:
00204     /*
00205     @param ptr[out] バッファへのポインタ
00206     @para size[in] size[in] ptrのサイズ
00207     @param it[in] begin()等でiteration中のiteratorとか
00208     @note
00209     これらのiteratorが使われている関数は
00210     TestFileFind()内を見ると良く分かるだろう。<br>
00211     */
00212     bool GetFilePath(char *ptr,size_t size,iterator &it,LPTSTR directory=NULL) const
00213     {
00214         if(directory==NULL){
00215             directory = const_cast<char *>(GetDirectory());
00216         }
00217         //この関数ってあぶなくね?
00218         PathCombine((LPTSTR)mTmp, directory, (*it).cFileName);
00219         return DKUTIL_SUCCEEDED(dkstrcpy(ptr,size,mTmp,strlen(mTmp)));
00220     }
00221 
00226 
00227     const char * GetFileName(iterator &it) const
00228     {
00229         return (*it).cFileName;
00230     }
00236 
00237     bool GetFileTitle(char *ptr,size_t size,iterator &it) const
00238     {
00239         //std::string str = GetFileName();
00240         NULL_CHAR_ARRAY(mTmp);
00241         
00242         {
00243             char *p = (*it).cFileName;
00244             dkstrcpy((char *)mTmp,sizeof(mTmp),p,strlen(p));
00245         }
00246 
00247         if(!IsDots(it))
00248         {
00249             //PathRemoveExtension(str.GetBuffer(0));
00250             //str.ReleaseBuffer();
00251             PathRemoveExtension((LPTSTR)mTmp);
00252         }
00253         int r = dkstrcpy(ptr,size,mTmp,sizeof(mTmp));
00254 
00255         return DKUTIL_SUCCEEDED(r);
00256     }
00257     BOOL MatchesMask(iterator &it,DWORD dwMask) const
00258     {
00259         return ((*it).dwFileAttributes & dwMask);
00260     }
00262     BOOL IsDots(iterator &it) const
00263     {
00264         if(IsDirectory(it))
00265         {
00266             return PathIsDots((*it).cFileName);
00267         }
00268         return FALSE;
00269     }
00272     const char * GetRoot() const
00273     {
00274         return GetDirectory();
00275     }
00276 
00282 
00283 
00284     bool GetFileURL(char *ptr,size_t size,iterator &it) const
00285     {
00286         NULL_CHAR_ARRAY(mTmp);
00287         GetFilePath((char *)mTmp,sizeof(mTmp),it);
00288         dksprintf((char *)ptr,size,_T("file://"));
00289         int r = dkstrcat2(ptr,size,mTmp);
00290         return DKUTIL_SUCCEEDED(r);
00291     }
00292     inline BOOL IsReadOnly(iterator it)   const { return MatchesMask(it,FILE_ATTRIBUTE_READONLY); }
00293     inline BOOL IsDirectory(iterator &it)  const { return MatchesMask(it,FILE_ATTRIBUTE_DIRECTORY); }
00294     inline BOOL IsCompressed(iterator &it) const { return MatchesMask(it,FILE_ATTRIBUTE_COMPRESSED); }
00295     inline BOOL IsSystem(iterator &it)     const { return MatchesMask(it,FILE_ATTRIBUTE_SYSTEM); }
00296     inline BOOL IsHidden(iterator &it)     const { return MatchesMask(it,FILE_ATTRIBUTE_HIDDEN); }
00297     inline BOOL IsTemporary(iterator &it)  const { return MatchesMask(it,FILE_ATTRIBUTE_TEMPORARY); }
00298     inline BOOL IsNormal(iterator &it)     const { return MatchesMask(it,FILE_ATTRIBUTE_NORMAL); }
00299     inline BOOL IsArchived(iterator &it)   const { return MatchesMask(it,FILE_ATTRIBUTE_ARCHIVE); }
00301     inline ULONGLONG GetFileSize(iterator &it) const {
00302         return ((*it).nFileSizeLow + 
00303             ((*it).nFileSizeHigh << 32));
00304     }
00305     BOOL PathIsDots(LPCTSTR lpszPath) const
00306     {
00307         if(*lpszPath == _T('.'))
00308         {
00309             switch(*(lpszPath + 1))
00310             {
00311                 case _T('.'):
00312                     if(*(lpszPath + 2))
00313                     {
00314                         break;
00315                     }
00316 
00317                 case _T('\0'):
00318                     return TRUE;
00319             }
00320         }
00321 
00322         return FALSE;
00323     }
00324 };
00325 
00326 typedef FileFinderBase<> FileFinder ;
00327 
00328 #endif //end of if 0
00329 
00330 
00331 
00332 
00333 
00334 }//end of dkutil namespace
00335 
00336 
00337 
00338 #endif//end of USE_DKINGYO_SHELL_AND_COMMON_CONTROL
00339 
00340 
00341 #endif//end of include once

dkutil 1.02リリース前 d金魚専用マニュアルバージョンに対してSun Dec 28 21:23:08 2003に生成されました。 doxygen 1.3.5