Develop and Download Open Source Software

Browse CVS Repository

Contents of /hos/tools/cvssync/TreeSearch.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.3 - (show annotations) (download) (as text)
Sun Jul 28 04:29:40 2002 UTC (21 years, 8 months ago) by ryuz
Branch: MAIN
CVS Tags: ver_0_04, HEAD
Changes since 1.2: +3 -3 lines
File MIME type: text/x-c++src
upade ver 0.05

1 // ---------------------------------------------------------------------------
2 // ツリー検索クラス
3 //
4 // Copyright (C) 2002 by Project HOS
5 // ---------------------------------------------------------------------------
6
7
8 #include <windows.h>
9 #include <tchar.h>
10 #include <stdio.h>
11 #include "TreeSearch.h"
12
13
14
15 // コンストラクタ
16 CTreeSearch::CTreeSearch(BOOL (*pfncProc)(LPCTSTR lpszFile1, LPCTSTR lpszFile2, int iFlag))
17 {
18 // ファイル処理ルーチンを登録
19 m_pfncProc = pfncProc;
20 }
21
22
23 // ツリーサーチ
24 BOOL CTreeSearch::Search(LPCTSTR lpszPath1, LPCTSTR lpszPath2)
25 {
26 TCHAR szSearchPath1[MAX_PATH];
27 TCHAR szSearchPath2[MAX_PATH];
28 TFileData* pfdFileList1;
29 TFileData* pfdFileList2;
30 TFileData* pFileData;
31 TFileData* pfdTmp;
32
33 // サーチパス作成
34 wsprintf(szSearchPath1, _T("%s*.*"), lpszPath1);
35 wsprintf(szSearchPath2, _T("%s*.*"), lpszPath2);
36
37 // ファイルリストの読み込み
38 pfdFileList1 = CreateFileList(szSearchPath1);
39 pfdFileList2 = CreateFileList(szSearchPath2);
40
41 // リスト1からサーチ
42 pFileData = pfdFileList1;
43 while ( pFileData != NULL )
44 {
45 if ( pFileData->wfdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
46 {
47 // ディレクトリなら
48 if ( lstrcmpi(pFileData->wfdFile.cFileName, _T(".")) != 0
49 && lstrcmpi(pFileData->wfdFile.cFileName, _T("..")) != 0
50 && lstrcmpi(pFileData->wfdFile.cFileName, _T("CVS")) != 0 ) // CVSフォルダは無視
51 {
52 TCHAR szSubDirectry1[MAX_PATH];
53 TCHAR szSubDirectry2[MAX_PATH];
54
55 // ディレクトリのフルパスを作成
56 wsprintf(szSubDirectry1, "%s%s\\", lpszPath1, pFileData->wfdFile.cFileName);
57 wsprintf(szSubDirectry2, "%s%s\\", lpszPath2, pFileData->wfdFile.cFileName);
58
59 // 相手に対応するファイルがあるか検索
60 pfdTmp = SearchFile(pfdFileList2, pFileData->wfdFile.cFileName);
61 if ( pfdTmp == NULL )
62 {
63 // 無ければ作成
64 if ( !CreateDirectory(szSubDirectry2, NULL) )
65 {
66 // 作成失敗
67 printf("fail : create directry \"%s\"\n", szSubDirectry2);
68 }
69 else
70 {
71 // 再起的に検索
72 printf("create directry \"%s\"\n", szSubDirectry2);
73 Search(szSubDirectry1, szSubDirectry2);
74 }
75 }
76 else
77 {
78 // あれば確認
79 if ( !(pfdTmp->wfdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
80 {
81 // 同名のファイルがある
82 printf("fail : create directry \"%s\"\n", szSubDirectry2);
83 }
84 else
85 {
86 // 再起的に検索
87 Search(szSubDirectry1, szSubDirectry2);
88 }
89 pfdTmp->blEnd = TRUE; // 処理済フラグセット
90 }
91 }
92 }
93 else
94 {
95 // ファイルなら
96 TCHAR szFileName1[MAX_PATH];
97 TCHAR szFileName2[MAX_PATH];
98
99 // ファイルのフルパスを作成
100 wsprintf(szFileName1, "%s%s", lpszPath1, pFileData->wfdFile.cFileName);
101 wsprintf(szFileName2, "%s%s", lpszPath2, pFileData->wfdFile.cFileName);
102
103 // 相手側に同名ファイルがあるかどうか検索
104 pfdTmp = SearchFile(pfdFileList2, pFileData->wfdFile.cFileName);
105 if ( pfdTmp == NULL )
106 {
107 // 無ければFile1のみでファイル処理ルーチン呼び出し
108 m_pfncProc(szFileName1, szFileName2, FILEPROC_FILE1);
109 }
110 else
111 {
112 // あれば双方ファイルありでファイル処理ルーチン呼び出し
113 m_pfncProc(szFileName1, szFileName2, FILEPROC_BOTH);
114 pfdTmp->blEnd = TRUE; // 処理済フラグセット
115 }
116 }
117 pFileData->blEnd = TRUE; // 処理済フラグセット
118 pFileData = pFileData->pNext; // 次のファイルを検索
119 }
120
121 // リスト2の残りをサーチ
122 pFileData = pfdFileList2;
123 while ( pFileData != NULL )
124 {
125 if ( !pFileData->blEnd ) // 未処理のものを処理する
126 {
127 if ( pFileData->wfdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
128 {
129 // ディレクトリなら
130 if ( lstrcmpi(pFileData->wfdFile.cFileName, _T(".")) != 0
131 && lstrcmpi(pFileData->wfdFile.cFileName, _T("..")) != 0
132 && lstrcmpi(pFileData->wfdFile.cFileName, _T("CVS")) != 0 ) // CVSディレクトリを無視
133 {
134 TCHAR szSubDirectry1[MAX_PATH];
135 TCHAR szSubDirectry2[MAX_PATH];
136
137 // ディレクトリのフルパスを作成
138 wsprintf(szSubDirectry1, "%s%s\\", lpszPath1, pFileData->wfdFile.cFileName);
139 wsprintf(szSubDirectry2, "%s%s\\", lpszPath2, pFileData->wfdFile.cFileName);
140
141 // ディレクトリを作成
142 if ( !CreateDirectory(szSubDirectry1, NULL) )
143 {
144 // 作成失敗
145 printf("fail : create directry \"%s\"\n", szSubDirectry1);
146 }
147 else
148 {
149 // 再起的に検索
150 printf("create directry \"%s\"\n", szSubDirectry1);
151 Search(szSubDirectry1, szSubDirectry2);
152 }
153 }
154 }
155 else
156 {
157 // ファイルなら
158 TCHAR szFileName1[MAX_PATH];
159 TCHAR szFileName2[MAX_PATH];
160
161 // ファイルのフルパス名を作成
162 wsprintf(szFileName1, "%s%s", lpszPath1, pFileData->wfdFile.cFileName);
163 wsprintf(szFileName2, "%s%s", lpszPath2, pFileData->wfdFile.cFileName);
164
165 // File2のみでファイル処理ルーチンを呼び出し
166 m_pfncProc(szFileName1, szFileName2, FILEPROC_FILE2);
167 }
168 }
169
170 pFileData->blEnd = TRUE; // 処理済フラグセット
171 pFileData = pFileData->pNext; // 次のファイルを検索
172 }
173
174 // ファイルリスト削除
175 DeleteFileList(pfdFileList1);
176 DeleteFileList(pfdFileList2);
177
178 return TRUE;
179 }
180
181
182 // ファイルリスト作成
183 TFileData* CTreeSearch::CreateFileList(LPCTSTR lpszPath)
184 {
185 TFileData* pfdFileList;
186 WIN32_FIND_DATA wfdFile; // ファイル情報
187 HANDLE hFind;
188
189 // ファイル検索ハンドルを開く
190 hFind = FindFirstFile(lpszPath, &wfdFile);
191 if ( hFind == INVALID_HANDLE_VALUE )
192 {
193 pfdFileList = NULL;
194 }
195 else
196 {
197 TFileData* pFileData;
198
199 // 先頭ファイルをリストに追加
200 pFileData = new TFileData;
201 pFileData->wfdFile = wfdFile;
202 pFileData->blEnd = FALSE;
203 pFileData->pNext = NULL;
204 pfdFileList = pFileData;
205
206 // 移行のファイルを見つかる限り追加
207 while ( FindNextFile(hFind, &wfdFile) )
208 {
209 pFileData = new TFileData;
210 pFileData->wfdFile = wfdFile;
211 pFileData->blEnd = FALSE;
212 pFileData->pNext = pfdFileList;
213 pfdFileList = pFileData;
214 }
215
216 // ファイル検索ハンドルを閉じる
217 FindClose(hFind);
218 }
219
220 return pfdFileList;
221 }
222
223
224 // ファイルリスト削除
225 void CTreeSearch::DeleteFileList(TFileData* pFileList)
226 {
227 TFileData* pFileData;
228 TFileData* pfdNext;
229
230 // リストをすべて削除
231 pFileData = pFileList;
232 while ( pFileData != NULL )
233 {
234 pfdNext = pFileData->pNext;
235 delete pFileData;
236 pFileData = pfdNext;
237 }
238 }
239
240
241 // ファイルリスト検索
242 TFileData* CTreeSearch::SearchFile(TFileData* pFileList, LPCTSTR lpszFileName)
243 {
244 TFileData* pFileData;
245
246 // 一致するファイル名を探す
247 pFileData = pFileList;
248 while ( pFileData != NULL )
249 {
250 if ( !pFileData->blEnd
251 && lstrcmpi(pFileData->wfdFile.cFileName, lpszFileName) == 0 )
252 {
253 break;
254 }
255 pFileData = pFileData->pNext;
256 }
257
258 return pFileData;
259 }
260
261
262 // ---------------------------------------------------------------------------
263 // Copyright (C) 2002 by Project HOS
264 // ---------------------------------------------------------------------------

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26