source: dev/trunk/ab5.0/abdev/abdev/FileOperation.cpp @ 717

Last change on this file since 717 was 717, checked in by dai, 15 years ago

#188への対応。UserSettingディレクトリを廃止し、正規のユーザ空間ディレクトリを取り入れた。

File size: 16.4 KB
Line 
1#include "stdafx.h"
2
3#include "Common.h"
4
5char *ReadBuffer( const std::string &path ){
6    extern HANDLE hHeap;
7    int i;
8    DWORD dw;
9    char *buffer,temporary[MAX_PATH];
10
11    ATL::CHandle hFile(CreateFile(path.c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
12    if(hFile==INVALID_HANDLE_VALUE){
13        hFile.Detach();
14        //"\"%s\" ファイルの読み込みに失敗しました。"
15        sprintf(temporary,STRING_ERROR_CANT_FILEOPEN,path.c_str());
16        MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
17
18        return 0;
19    }
20    i=GetFileSize(hFile,0);
21    buffer=(char *)HeapAlloc(hHeap,0,i+1);
22    ReadFile(hFile,buffer,i,&dw,0);
23    buffer[dw]=0;
24    return buffer;
25}
26char *ReadBuffer_NonErrMsg( const std::string &path ){
27    extern HANDLE hHeap;
28    DWORD dw;
29
30    ATL::CHandle hFile(CreateFile(path.c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
31    if(hFile==INVALID_HANDLE_VALUE){
32        hFile.Detach();
33        return 0;
34    }
35    int i=GetFileSize(hFile,0);
36    char *buffer=(char *)HeapAlloc(hHeap,0,i+1);
37    ReadFile(hFile,buffer,i,&dw,0);
38    buffer[dw]=0;
39    return buffer;
40}
41_int8 WriteBuffer(const std::string &path,const char *buffer,int length, bool isEnableError)
42{
43    DWORD dw;
44    ATL::CHandle hFile(CreateFile(path.c_str(),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL));
45    if(hFile==INVALID_HANDLE_VALUE){
46        hFile.Detach();
47
48        char temporary[MAX_PATH];
49        if( isEnableError ){
50            //"\"%s\" ファイルへの書き込みに失敗しました。"
51            sprintf(temporary,STRING_ERROR_CANT_FILESAVE,path);
52            MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
53        }
54        return 0;
55    }
56    if(length) WriteFile(hFile,buffer,length,&dw,NULL);
57    return 1;
58}
59_int8 WriteBuffer_NonErrMsg(const std::string &path,char *buffer,int length){
60    return WriteBuffer( path, buffer, length, false );
61}
62void GetRelationalPath(char *path,char *dir){
63    //相対パスを取得
64    int i,i2,i3,i4,i5;
65    char temporary[MAX_PATH],temp2[MAX_PATH],temp3[MAX_PATH],temp4[MAX_PATH];
66
67    //ドライブ名をチェック
68    _splitpath(path,temporary,0,0,0);
69    _splitpath(dir,temp2,0,0,0);
70    if(lstrcmpi(temporary,temp2)!=0) return;
71
72    _splitpath(path,0,temporary,0,0);
73    _splitpath(dir,0,temp2,0,0);
74    i=1;i2=1;
75    while(1){
76        i4=i;
77        if(temporary[i-1]=='\\'&&temporary[i]){ //path側
78            for(i3=0;;i++,i3++){
79                if(temporary[i]=='\\'){
80                    temp3[i3]=0;
81                    i++;
82                    break;
83                }
84                temp3[i3]=temporary[i];
85            }
86        }
87        else temp3[0]=0;
88
89        i5=i2;
90        if(temp2[i2-1]=='\\'&&temp2[i2]){       //dir側
91            for(i3=0;;i2++,i3++){
92                if(temp2[i2]=='\\'){
93                    temp4[i3]=0;
94                    i2++;
95                    break;
96                }
97                temp4[i3]=temp2[i2];
98            }
99        }
100        else temp4[0]=0;
101
102        if(temp3[0]=='\0'&&temp4[0]=='\0') break;
103
104        if(lstrcmpi(temp3,temp4)!=0){
105            for(i3=0;;i5++){
106                if(temp2[i5]=='\0') break;
107                if(temp2[i5]=='\\') i3++;
108            }
109            temp3[0]=0;
110            for(i2=0;i2<i3;i2++) lstrcat(temp3,"..\\");
111            lstrcat(temp3,temporary+i4);
112            break;
113        }
114    }
115    _splitpath(path,0,0,temporary,temp2);
116    lstrcat(temp3,temporary);
117    lstrcat(temp3,temp2);
118    lstrcpy(path,temp3);
119}
120void GetFullPath(char *path,const char *dir){
121    int i,i2,i3,i4;
122    char temporary[MAX_PATH];
123
124    if(strstr(path,":")||strstr(path,"\\\\")) return;
125
126    i=0;i2=0;
127    while(1){
128        if(path[i]=='.'&&path[i+1]=='\\') i+=2;
129        if(path[i]=='.'&&path[i+1]=='.'&&path[i+2]=='\\'){
130            i2++;
131            i+=3;
132        }
133        else break;
134    }
135
136    i3=lstrlen(dir);i4=0;
137    while(i4<i2){
138        for(i3--;;i3--){
139            if(dir[i3-1]=='\\'){
140                i4++;
141                break;
142            }
143        }
144    }
145    memcpy(temporary,dir,i3);
146    temporary[i3]=0;
147    lstrcat(temporary,path+i);
148    lstrcpy(path,temporary);
149}
150
151void RemoveDirectoryStrong(const char *dirPath){
152    char tempDirPath[MAX_PATH];
153    lstrcpy( tempDirPath, dirPath );
154
155    if( tempDirPath[lstrlen(tempDirPath)-1] == '\\' ){
156         tempDirPath[lstrlen(tempDirPath)-1] = 0;
157    }
158
159    HANDLE hFind;
160    WIN32_FIND_DATA wfd;
161    char temporary[MAX_PATH];
162    sprintf(temporary,"%s\\*",tempDirPath);
163
164    hFind=FindFirstFile(temporary,&wfd);
165    if(hFind!=INVALID_HANDLE_VALUE){
166        do{
167            if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
168                if(!(lstrcmp(wfd.cFileName,".")==0||lstrcmp(wfd.cFileName,"..")==0)){
169                    //ディレクトリのとき
170                    sprintf(temporary,"%s\\%s\\",tempDirPath,wfd.cFileName);
171                    RemoveDirectoryStrong(temporary);
172                }
173            }
174            else{
175                //ファイルのとき
176                sprintf(temporary,"%s\\%s",tempDirPath,wfd.cFileName);
177
178                DeleteFile(temporary);
179            }
180        }while(FindNextFile(hFind,&wfd));
181
182        FindClose( hFind );
183    }
184
185    if( !RemoveDirectory(tempDirPath) ){
186        OutputDebugString( GetLastErrorString().c_str() );
187        OutputDebugString( "\r\n" );
188        OutputDebugString( "一時ディレクトリの削除に失敗\r\n" );
189    }
190}
191
192BOOL GetFilePathDialog(HWND hwnd,char *filename,LPSTR Filter,LPSTR Title,_int8 IsOpen){
193    OPENFILENAME ofstr;
194    filename[0]=0;
195    ofstr.lStructSize=sizeof(OPENFILENAME);
196    ofstr.hwndOwner=hwnd;
197    ofstr.hInstance=0;
198    ofstr.lpstrFilter=Filter;
199    ofstr.lpstrCustomFilter=NULL;
200    ofstr.nMaxCustFilter=0;
201    ofstr.nFilterIndex=1;
202    ofstr.lpstrFile=filename;
203    ofstr.nMaxFile=MAX_PATH;
204    ofstr.lpstrFileTitle=NULL;
205    ofstr.nMaxFileTitle=0;
206    ofstr.lpstrInitialDir=pobj_nv->DefSaveDir;
207    ofstr.lpstrTitle=Title;
208    ofstr.Flags=OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST;
209    ofstr.nFileOffset=0;
210    ofstr.nFileExtension=0;
211    ofstr.lpstrDefExt="*";
212    ofstr.lCustData=NULL;
213    ofstr.lpfnHook=NULL;
214    ofstr.lpTemplateName=NULL;
215    if(IsOpen){
216        if(!GetOpenFileName(&ofstr)) return FALSE;
217    }
218    else{
219        if(!GetSaveFileName(&ofstr)) return FALSE;
220    }
221
222    //次回の初期ディレクトリをセット
223    char temporary[MAX_PATH];
224    _splitpath(filename,pobj_nv->DefSaveDir,temporary,NULL,NULL);
225    lstrcat(pobj_nv->DefSaveDir,temporary);
226
227    return TRUE;
228}
229BOOL GetFolder(HWND hWnd,char *folder,char *OpenFolderTitle){
230    BROWSEINFO BrowseInfo;
231    LPITEMIDLIST pidlBrowse;
232    LPMALLOC g_pMalloc;
233    char temporary[MAX_PATH];
234
235    BrowseInfo.hwndOwner=hWnd;
236    BrowseInfo.pszDisplayName=temporary;
237    BrowseInfo.pidlRoot=NULL;
238    BrowseInfo.lpszTitle=OpenFolderTitle;
239    BrowseInfo.ulFlags=BIF_RETURNONLYFSDIRS;
240    BrowseInfo.lpfn=NULL;
241    BrowseInfo.lParam=(LPARAM)0;
242    BrowseInfo.iImage=0;
243    pidlBrowse=SHBrowseForFolder(&BrowseInfo);
244    if(pidlBrowse){
245        if(SHGetMalloc(&g_pMalloc)!=0) return 0;
246        SHGetPathFromIDList(pidlBrowse,folder);
247        g_pMalloc->Free(pidlBrowse);
248        g_pMalloc->Release();
249        return 1;
250    }
251    return 0;
252}
253
254int GetFileExtension( const char *path )
255{
256    char temporary[MAX_PATH];
257    _splitpath(path,0,0,0,temporary);
258
259    if(lstrcmpi(temporary,".bas")==0||
260        lstrcmpi(temporary,".ab")==0||
261        lstrcmpi(temporary,".abp")==0) return FT_BASICPROGRAM;
262    if(lstrcmpi(temporary,".sbp")==0) return FT_SUBPROGRAM;
263    if(lstrcmpi(temporary,".txt")==0) return FT_TEXT;
264    if(lstrcmpi(temporary,".pj")==0) return FT_PROJECT;
265    if(lstrcmpi(temporary,".ico")==0) return FT_ICON;
266
267    if(lstrcmpi(temporary,".html")==0||
268        lstrcmpi(temporary,".htm")==0||
269        lstrcmpi(temporary,".tpl")==0||
270        lstrcmpi(temporary,".php")==0)
271        return FT_HTML;
272
273    return FT_OTHER;
274}
275HWND OpenFileWithExtension( const std::string &filePath )
276{
277    int i;
278    _int8 DocumentType;
279
280    // TODO:
281    char const *OpenFileName = filePath.c_str();
282
283    i=GetFileExtension(OpenFileName);
284
285#ifndef THETEXT
286    if(i==FT_PROJECT){
287        //「最近使ったプロジェクト」に追加
288        pobj_nv->pobj_ProjectHistory->insert(OpenFileName);
289
290        projectInfo.Load(OpenFileName);
291        return 0;
292    }
293#endif
294
295    //「最近使ったファイル」に追加
296    pobj_nv->pobj_History->insert(OpenFileName);
297
298    if(i==FT_ICON){
299        NewIconEditWindow(OpenFileName);
300        return 0;
301    }
302    else if(i==FT_BASICPROGRAM||i==FT_SUBPROGRAM){
303        DocumentType=WNDTYPE_BASIC;
304
305#ifdef THETEXT
306        DocumentType=WNDTYPE_TEXT;
307#endif
308    }
309    else if(i==FT_HTML) DocumentType=WNDTYPE_HTML;
310    else DocumentType=WNDTYPE_TEXT;
311
312    COLORREF TabColor;
313    TabColor=pobj_nv->pobj_ExtLink->GetTabColorFromFilePath( filePath );
314
315    return NewTextEditWindow(OpenFileName,DocumentType,TabColor);
316}
317
318BOOL GetFileInformationByHandleWrap(HANDLE hFile, BY_HANDLE_FILE_INFORMATION& fi){
319    typedef BOOL WINAPI GFIBH(HANDLE, LPBY_HANDLE_FILE_INFORMATION);
320    GFIBH *const pgfibh = reinterpret_cast<GFIBH*>(
321        GetProcAddress(GetModuleHandle("kernel32"), "GetFileInformationByHandle"));
322    if(pgfibh){
323        return pgfibh(hFile, &fi);
324    }
325    else{
326        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
327        return FALSE;
328    }
329}
330
331//重複チェック用のデータを設定
332void SetFileIdentity(FILEIDENTITY &fi, BY_HANDLE_FILE_INFORMATION const &bhfi){
333    fi.VolumeSerialNumber = bhfi.dwVolumeSerialNumber;
334    fi.FileIndexHigh = bhfi.nFileIndexHigh;
335    fi.FileIndexLow = bhfi.nFileIndexLow;
336}
337
338void SetFileIdentityFromFile(MDIINFO &mi, HANDLE hFile){
339    BY_HANDLE_FILE_INFORMATION fi;
340    if(GetFileInformationByHandleWrap(hFile, fi)){
341        SetFileIdentity(mi.FileIdentity, fi);
342    }
343}
344
345BOOL SaveDocument(HWND hChild,char *SaveFileName){  //ウィンドウからバッファを読み取り、ファイルに保存
346    //SaveFileNameがNULLのときは上書き保存を試みる。
347    extern LPSTR IconFileFilter;
348    extern HWND hClient,hDocCombo;
349    int WndNum,i2;
350    char temporary[MAX_PATH],str[MAX_PATH],str2[32];
351    DWORD dummy;
352
353    WndNum=GetWndNum(hChild);
354
355    std::string oldTitle = MdiInfo[WndNum]->title;
356
357    if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD||MdiInfo[WndNum]->DocType==WNDTYPE_MENU){
358        ////////////////////////////////////
359        // RADツール及びメニューエディタ
360        ////////////////////////////////////
361
362        if(projectInfo.ModifyOfMaterial){
363            std::string const& workDir = projectInfo.GetWorkDir().GetPath();
364            std::string const& projName = projectInfo.GetName();
365            std::string t;
366            t.reserve( workDir.size() + projName.size() + 4 );
367            t += workDir;
368            t += projName;
369            t += ".wnd";
370            SaveWindowFile( t.c_str(), projectInfo.windowInfos );
371
372            //.wbpファイルを生成
373            SaveWindowProgram();
374        }
375    }
376    else if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
377        //////////////////////////
378        // テキストドキュメント
379        //////////////////////////
380
381        if(SaveFileName){
382            lstrcpy(temporary,SaveFileName);
383            {
384                ATL::CHandle fh(CreateFile(temporary,GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL));
385                if(fh==INVALID_HANDLE_VALUE){
386                    fh.Detach();
387                    sprintf(str,STRING_FILE_OVERWRIDE,temporary);
388                    if(MessageBox(hOwner,str,APPLICATION_NAME,MB_YESNO|MB_ICONINFORMATION)==IDNO){
389                        return 0;
390                    }
391                }
392            }
393
394            //ドキュメント セレクト コンボボックスから消去
395            i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
396            SendMessage(hDocCombo,CB_DELETESTRING,i2,0);
397
398            //新しいパスをセット
399            MdiInfo[WndNum]->path = temporary;
400
401            //ドキュメント セレクト コンボボックスに挿入
402            _splitpath(temporary,NULL,NULL,str,str2);
403            lstrcat(str,str2);
404            MdiInfo[WndNum]->title = str;
405            SendMessage(hDocCombo,CB_ADDSTRING,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
406            i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
407            SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
408
409            //MDIウィンドウのタイトルを再設定
410            SetWindowText(hChild,MdiInfo[WndNum]->title.c_str());
411        }
412        else{
413            if(MdiInfo[WndNum]->path.empty()){
414                //"保存先のファイルを指定してください"
415get_file_path:
416
417                LPSTR ff;
418
419                extern LPSTR DefFileFilter;
420                extern LPSTR HtmlFileFilter;
421                extern LPSTR TextFileFilter;
422                if(MdiInfo[WndNum]->DocType==WNDTYPE_BASIC)
423                    ff=DefFileFilter;
424                else if(MdiInfo[WndNum]->DocType==WNDTYPE_HTML)
425                    ff=HtmlFileFilter;
426                else if(MdiInfo[WndNum]->DocType==WNDTYPE_TEXT)
427                    ff=TextFileFilter;
428
429                if(!GetFilePathDialog(hOwner,temporary,ff,STRING_FILESAVETITLE_DEFAULT,FALSE)) return 0;
430                SaveDocument(hChild,temporary);
431                return 1;
432            }
433            lstrcpy(temporary,MdiInfo[WndNum]->path.c_str());
434        }
435
436        if(!IsExistFile(temporary)){
437            //保存先ファイルが存在しないとき
438            char temp2[MAX_PATH];
439
440            //初期ディレクトリをセット
441            _splitpath(temporary,pobj_nv->DefSaveDir,temp2,NULL,NULL);
442            lstrcat(pobj_nv->DefSaveDir,temp2);
443
444            goto get_file_path;
445        }
446
447        //文字コードを復元
448        char *pBuf;
449        pBuf=nkf.RestoreBuffer(MdiInfo[WndNum]->pMdiTextEdit->buffer,MdiInfo[WndNum]->pMdiTextEdit->iCharCode);
450
451        //改行コードを復元
452        if(MdiInfo[WndNum]->pMdiTextEdit->iLfCode==LFCODE_LF) nkf.ToLF(pBuf);
453        else if(MdiInfo[WndNum]->pMdiTextEdit->iLfCode==LFCODE_CR) nkf.ToCR(pBuf);
454
455
456        ////////////////////////
457        // 保存
458        ////////////////////////
459
460        {
461            ATL::CHandle fh(CreateFile(temporary,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL));
462            if(fh==INVALID_HANDLE_VALUE){
463                fh.Detach();
464                sprintf(str,STRING_ERROR_CANT_FILESAVE,temporary);
465                MessageBox(hOwner,str,STRING_ERROR,MB_OK|MB_ICONSTOP);
466                return 0;
467            }
468            WriteFile(fh,pBuf,strlen(pBuf),&dummy,NULL);
469            SetFileIdentityFromFile(*MdiInfo[WndNum], fh);
470        }
471
472
473        HeapDefaultFree(pBuf);
474
475        //変更フラグをオフにする
476        MdiInfo[WndNum]->pMdiTextEdit->UnModify();
477    }
478    else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
479        ///////////////////
480        // ICON
481        ///////////////////
482
483        if(SaveFileName){
484            lstrcpy(temporary,SaveFileName);
485            {
486                ATL::CHandle fh(CreateFile(temporary,GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL));
487                if(fh==INVALID_HANDLE_VALUE){
488                    fh.Detach();
489                    sprintf(str,STRING_FILE_OVERWRIDE,temporary);
490                    if(MessageBox(hOwner,str,APPLICATION_NAME,MB_YESNO|MB_ICONINFORMATION)==IDNO){
491                        return 0;
492                    }
493                }
494            }
495            MdiInfo[WndNum]->path = temporary;
496            i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
497            SendMessage(hDocCombo,CB_DELETESTRING,i2,0);
498            _splitpath(temporary,NULL,NULL,str,str2);
499            lstrcat(str,str2);
500            MdiInfo[WndNum]->title = str;
501            SendMessage(hDocCombo,CB_ADDSTRING,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
502            i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
503            SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
504            SetWindowText(hChild,MdiInfo[WndNum]->title.c_str());
505        }
506        else{
507            if(MdiInfo[WndNum]->path.empty()){
508                //"保存先のファイルを指定してください"
509                if(!GetFilePathDialog(hOwner,temporary,IconFileFilter,STRING_FILESAVETITLE_DEFAULT,FALSE)) return 0;
510                SaveDocument(hChild,temporary);
511                return 1;
512            }
513            lstrcpy(temporary,MdiInfo[WndNum]->path.c_str());
514        }
515        SaveIconFile(temporary,hChild);
516
517        MdiInfo[WndNum]->MdiIconEditInfo->bModify=0;
518    }
519
520
521    //タブコントロールを再設定
522    if(pobj_nv->bSaveTabToHead){
523        COLORREF color;
524        color=pobj_MainTab->GetItemColor(oldTitle.c_str());
525        pobj_MainTab->DeleteItem( oldTitle.c_str(), false );
526        pobj_MainTab->InsertItem( MdiInfo[WndNum]->title.c_str(), false, color );
527    }
528    else{
529        pobj_MainTab->RenameItem( oldTitle.c_str(), MdiInfo[WndNum]->title.c_str() );
530    }
531
532    //「最近使ったファイル」を更新
533    pobj_nv->pobj_History->insert(MdiInfo[WndNum]->path.c_str());
534
535    return 1;
536}
537BOOL ShortPathToLongPath(char ShortPath[MAX_PATH],char *LongPath){
538    HANDLE hFind;
539    WIN32_FIND_DATA wfd;
540    int i;
541    char dummy[MAX_PATH];
542    for(i=0;i<MAX_PATH;i++){
543        LongPath[i]=ShortPath[i];
544        if((ShortPath[i-1]==':'&&ShortPath[i]=='\\')||(ShortPath[i-1]=='\\'&&ShortPath[i]=='\\')){
545            LongPath[i+1]=0;
546            break;
547        }
548    }
549    if(ShortPath[i-1]=='\\'&&ShortPath[i]=='\\'){
550        for(i++;i<MAX_PATH;i++){
551            if(IsDBCSLeadByte(ShortPath[i])){
552                i++;
553                continue;
554            }
555            LongPath[i]=ShortPath[i];
556            if(ShortPath[i]=='\\'){
557                LongPath[i+1]=0;
558                break;
559            }
560        }
561        for(i++;i<MAX_PATH;i++){
562            if(IsDBCSLeadByte(ShortPath[i])){
563                i++;
564                continue;
565            }
566            LongPath[i]=ShortPath[i];
567            if(ShortPath[i]=='\\'){
568                LongPath[i+1]=0;
569                break;
570            }
571        }
572    }
573    for(i++;i<MAX_PATH;i++){
574        if(IsDBCSLeadByte(ShortPath[i])){
575            i++;
576            continue;
577        }
578        if(ShortPath[i]=='\\'||ShortPath[i]=='\0'){
579            strncpy(dummy,ShortPath,i);
580            dummy[i]=0;
581            if((hFind=FindFirstFile(dummy,&wfd))!=INVALID_HANDLE_VALUE) FindClose(hFind);
582            lstrcat(LongPath,wfd.cFileName);
583
584            if(ShortPath[i]=='\0') break;
585            lstrcat(LongPath,"\\");
586
587            if(ShortPath[i]=='\\'&&ShortPath[i+1]=='\0'){
588                break;
589            }
590        }
591    }
592    return 1;
593}
594
595bool IsExistFile( const char *FilePath ){
596    WIN32_FIND_DATA wfd;
597    HANDLE hFind;
598
599    hFind = FindFirstFile(FilePath,&wfd);
600    if( hFind == INVALID_HANDLE_VALUE ){
601        return false;
602    }
603    FindClose( hFind );
604
605    return true;
606}
607
608bool IsExistDirectory( const char *DirPath ){
609    WIN32_FIND_DATA wfd;
610    HANDLE hFind;
611
612    hFind = FindFirstFile(DirPath,&wfd);
613    if( hFind == INVALID_HANDLE_VALUE ){
614        //存在しない
615        return false;
616    }
617    FindClose( hFind );
618
619    if( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ){
620        //ディレクトリの場合
621        return true;
622    }
623
624    //存在しない
625    return false;
626}
Note: See TracBrowser for help on using the repository browser.