'************************************************** ' ' FileChecker Ver.1.1.0.0 ' ' (c)2003 Isao Mori(Orios),All rights reserved. '************************************************** #resource "FileChecker.rc" Const IDI_ICON=1000 Const IDI_MINIICON=1001 Const IDI_FOLDEROPEN=1002 Const IDC_Reference1=2001 Const IDC_Reference2=2002 '======================================== ' 変数宣言 '======================================== Dim lpofn As OPENFILENAME Dim FileName_null[MAX_PATH] As Byte Dim FileTitle_null[MAX_PATH] As Byte Dim wcl As WNDCLASSEX Dim hMainWnd As Long Dim hFileName1 As Long Dim hReference1 As Long Dim hFileName2 As Long Dim hReference2 As Long Dim hEdit1 As Long Dim hEdit2 As Long Dim hRunEditor1 As Long Dim hRunEditor2 As Long Dim hSearch As Long Dim hIcon As Long Dim hBrush As Long Dim hDC1 As Long Dim hDC2 As Long Dim lpMsg As MSG Dim FileName[1] As String Dim hFile[1] As Long Dim FileSize[1] As Long Dim FileData[1] As String Dim lpNumberOfBytesRead As DWord Dim NullPoint1 As Long Dim NullPoint2 As Long '======================================== ' 変数の設定 '======================================== FillMemory(VarPtr(lpofn),Len(lpofn),0) lpofn.lStructSize=Len(lpofn) lpofn.hwndOwner=hMainWnd lpofn.lpstrFilter=Ex"すべてのファイル(*.*)\0*.*\0\0" lpofn.nFilterIndex=1 lpofn.lpstrFile=FileName_null lpofn.nMaxFile=MAX_PATH lpofn.lpstrFileTitle=FileTitle_null lpofn.nMaxFileTitle=MAX_PATH lpofn.lpstrTitle="ファイルの選択" lpofn.Flags=OFN_FILEMUSTEXIST or OFN_NODEREFERENCELINKS or OFN_HIDEREADONLY '======================================== ' コールバック関数 '======================================== Function MainWndProc(ByVal hWnd As Long,ByVal Message As Long,ByVal wParam As Long,ByVal lParam As Long) As Long DrawIconEx(hDC1,3,3,hIcon,16,16,NULL,hBrush,DI_NORMAL) DrawIconEx(hDC2,3,3,hIcon,16,16,NULL,hBrush,DI_NORMAL) Select Case Message 'サイズ変更 Case WM_SIZE SetWindowPos(hFileName1,NULL,10,8,Int((LOWORD(lParam)-90)/2),24,SWP_NOZORDER) SetWindowPos(hReference1,NULL,Int((LOWORD(lParam)-90)/2)+18,8,24,24,SWP_NOZORDER) SetWindowPos(hFileName2,NULL,Int((LOWORD(lParam)-30)/2)+20,8,Int((LOWORD(lParam)-30)/2)-30,24,SWP_NOZORDER) SetWindowPos(hReference2,NULL,LOWORD(lParam)-32,8,24,24,SWP_NOZORDER) SetWindowPos(hEdit1,NULL,10,40,Int((LOWORD(lParam)-30)/2),HIWORD(lParam)-120,SWP_NOZORDER) SetWindowPos(hEdit2,NULL,Int((LOWORD(lParam)-30)/2)+20,40,Int((LOWORD(lParam)-30)/2),HIWORD(lParam)-120,SWP_NOZORDER) SetWindowPos(hRunEditor1,NULL,10,HIWORD(lParam)-72,Int((LOWORD(lParam)-30)/2),24,SWP_NOZORDER) SetWindowPos(hRunEditor2,NULL,Int((LOWORD(lParam)-30)/2)+20,HIWORD(lParam)-72,Int((LOWORD(lParam)-30)/2),24,SWP_NOZORDER) SetWindowPos(hSearch,NULL,10,HIWORD(lParam)-40,LOWORD(lParam)-20,30,SWP_NOZORDER) 'ウィンドウを閉じる Case WM_CLOSE DestroyWindow(hMainWnd) 'プログラムを終了する Case WM_DESTROY PostQuitMessage(0) Case WM_COMMAND Select Case lParam '参照1 Case hReference1 Reference1() '参照2 Case hReference2 Reference2() '編集1 Case hRunEditor1 If FileName[0]="" Then MessageBox(NULL,"ファイルが選択されていません。","FileChecker 1.1.0.0",MB_OK or MB_ICONEXCLAMATION) Else Exec FileName[0] EndIf '編集2 Case hRunEditor2 If FileName[1]="" Then MessageBox(NULL,"ファイルが選択されていません。","FileChecker 1.1.0.0",MB_OK or MB_ICONEXCLAMATION) Else Exec FileName[1] EndIf '相違点検索 Case hSearch Search() EndSelect 'その他のとき Case Else MainWndProc=DefWindowProc(hWnd,Message,wParam,lParam) ExitFunction EndSelect MainWndProc=0 End Function '======================================== ' ウィンドウ設定 '======================================== FillMemory(VarPtr(wcl),Len(wcl),0) wcl.cbSize=Len(wcl) wcl.hInstance=GetModuleHandle(0) wcl.style=CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS wcl.hIcon=LoadIcon(GetModuleHandle(0),IDI_ICON) wcl.hIconSm=LoadIcon(GetModuleHandle(0),IDI_MINIICON) wcl.hCursor=LoadCursor(GetModuleHandle(0),IDC_ARROW) wcl.lpszClassName="NORMAL" wcl.lpfnWndProc=AddressOf(MainWndProc) wcl.hbrBackground=CreateSolidBrush(GetSysColor(COLOR_3DFACE)) RegisterClassEx(wcl) Window hMainWnd,NULL,CW_USEDEFAULT,CW_USEDEFAULT,400+GetSystemMetrics(SM_CXFIXEDFRAME)*2,300+GetSystemMetrics(SM_CXFIXEDFRAME)*2+GetSystemMetrics(SM_CYCAPTION),"FileChecker Ver.1.1.0.0",WS_OVERLAPPEDWINDOW or WS_VISIBLE,"NORMAL",,,WS_EX_APPWINDOW Window hFileName1,hMainWnd,10,8,155,24,"",WS_CHILD or WS_VISIBLE,"STATIC",,,WS_EX_CLIENTEDGE Window hReference1,hMainWnd,173,8,24,24,"",WS_CHILD or WS_VISIBLE or BS_ICON,"BUTTON",IDC_Reference1 Window hFileName2,hMainWnd,205,8,155,24,"",WS_CHILD or WS_VISIBLE,"STATIC",,,WS_EX_CLIENTEDGE Window hReference2,hMainWnd,368,8,24,24,"",WS_CHILD or WS_VISIBLE or BS_ICON,"BUTTON",IDC_Reference2 Window hEdit1,hMainWnd,10,40,185,180,"",WS_CHILD or WS_VISIBLE or ES_READONLY or ES_MULTILINE or ES_WANTRETURN or ES_AUTOHSCROLL or ES_AUTOVSCROLL or WS_HSCROLL or WS_VSCROLL,"EDIT",,,WS_EX_CLIENTEDGE Window hEdit2,hMainWnd,205,40,185,180,"",WS_CHILD or WS_VISIBLE or ES_READONLY or ES_MULTILINE or ES_WANTRETURN or ES_AUTOHSCROLL or ES_AUTOVSCROLL or WS_HSCROLL or WS_VSCROLL,"EDIT",,,WS_EX_CLIENTEDGE Window hRunEditor1,hMainWnd,10,228,185,24,"編集",WS_CHILD or WS_VISIBLE,"BUTTON" Window hRunEditor2,hMainWnd,205,228,185,24,"編集",WS_CHILD or WS_VISIBLE,"BUTTON" Window hSearch,hMainWnd,10,260,380,30,"相違点検索",WS_CHILD or WS_VISIBLE,"BUTTON" '======================================== ' アイコンの貼り付け '======================================== hIcon=LoadIcon(GetModuleHandle(0),IDI_FOLDEROPEN) hBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE)) hDC1=GetWindowDC(hReference1) hDC2=GetWindowDC(hReference2) '======================================== ' メッセージループ '======================================== While GetMessage(lpMsg,0,0,0)>0 'メッセージ処理 TranslateMessage(lpMsg) DispatchMessage(lpMsg) WEnd End '======================================== ' 参照1 '======================================== Sub Reference1() Dim Flag As Long Flag=GetOpenFileName(lpofn) If Flag=0 Then ExitSub EndIf If lpofn.lpstrFile=FileName[1] Then MessageBox(NULL,"同じファイルは比較できません。","FileChecker 1.1.0.0",MB_ICONEXCLAMATION or MB_OK) ExitSub EndIf FileName[0]=lpofn.lpstrFile SendMessage(hFileName1,WM_SETTEXT,0,lpofn.lpstrFileTitle) EndSub '======================================== ' 参照2 '======================================== Sub Reference2() Dim Flag As Long Flag=GetOpenFileName(lpofn) If Flag=0 Then ExitSub EndIf If FileName[0]=lpofn.lpstrFile Then MessageBox(NULL,"同じファイルは比較できません。","FileChecker 1.1.0.0",MB_ICONEXCLAMATION or MB_OK) ExitSub EndIf FileName[1]=lpofn.lpstrFile SendMessage(hFileName2,WM_SETTEXT,0,lpofn.lpstrFileTitle) EndSub '======================================== ' 相違点検索(Text) '======================================== Sub TextSearch() Dim NowPos[1] As Long Dim NowLine[1] As String Dim InfoStr[1] As String Dim LineNo As Long If InStr(1,FileData[0],Chr$(13)+Chr$(10))>0 AND InStr(1,FileData[1],Chr$(13)+Chr$(10))>0 Then Goto *Windows ElseIf InStr(1,FileData[0],Chr$(10))>0 OR InStr(1,FileData[1],Chr$(10))>0 Then Goto *Macintosh ElseIf InStr(1,FileData[0],Chr$(13))>0 OR InStr(1,FileData[1],Chr$(13))>0 Then Goto *Unix Else If FileData[0]<>FileData[1] Then InfoStr[0]=InfoStr[0]+" 1行目:"+NowLine[0]+Chr$(13)+Chr$(10) InfoStr[1]=InfoStr[1]+" 1行目:"+NowLine[1]+Chr$(13)+Chr$(10) EndIf Goto *AfterDeal EndIf *Windows Do NowPos[0]=InStr(1,FileData[0],Chr$(13)+Chr$(10))-1 If NowPos[0]=-1 Then NowLine[0]=Mid$(FileData[0],1) FileData[0]="" ElseIf NowPos[0]=0 Then NowLine[0]="" FileData[0]=Mid$(FileData[0],3) Else NowLine[0]=Mid$(FileData[0],1,NowPos[0]) FileData[0]=Mid$(FileData[0],NowPos[0]+3) EndIf NowPos[1]=InStr(1,FileData[1],Chr$(13)+Chr$(10))-1 If NowPos[1]=-1 Then NowLine[1]=Mid$(FileData[1],1) FileData[1]="" ElseIf NowPos[1]=0 Then NowLine[1]="" FileData[1]=Mid$(FileData[1],3) Else NowLine[1]=Mid$(FileData[1],1,NowPos[1]) FileData[1]=Mid$(FileData[1],NowPos[1]+3) EndIf LineNo=LineNo+1 If NowLine[0]<>NowLine[1] Then InfoStr[0]=InfoStr[0]+Str$(LineNo)+"行目:"+NowLine[0]+Chr$(13)+Chr$(10) InfoStr[1]=InfoStr[1]+Str$(LineNo)+"行目:"+NowLine[1]+Chr$(13)+Chr$(10) EndIf NowLine[0]="" NowLine[1]="" Loop Until NowPos[0]=-1 OR NowPos[1]=-1 Goto *AfterDeal *Macintosh Do NowPos[0]=InStr(1,FileData[0],Chr$(10))-1 If NowPos[0]=-1 Then NowLine[0]=Mid$(FileData[0],1) FileData[0]="" ElseIf NowPos[0]=0 Then NowLine[0]="" FileData[0]=Mid$(FileData[0],2) Else NowLine[0]=Mid$(FileData[0],1,NowPos[0]) FileData[0]=Mid$(FileData[0],NowPos[0]+2) EndIf NowPos[1]=InStr(1,FileData[1],Chr$(10))-1 If NowPos[1]=-1 Then NowLine[1]=Mid$(FileData[1],1) FileData[1]="" ElseIf NowPos[1]=0 Then NowLine[1]="" FileData[1]=Mid$(FileData[1],2) Else NowLine[1]=Mid$(FileData[1],1,NowPos[1]) FileData[1]=Mid$(FileData[1],NowPos[1]+2) EndIf LineNo=LineNo+1 If NowLine[0]<>NowLine[1] Then InfoStr[0]=InfoStr[0]+Str$(LineNo)+"行目:"+NowLine[0]+Chr$(13)+Chr$(10) InfoStr[1]=InfoStr[1]+Str$(LineNo)+"行目:"+NowLine[1]+Chr$(13)+Chr$(10) EndIf NowLine[0]="" NowLine[1]="" Loop Until NowPos[0]=-1 OR NowPos[1]=-1 Goto *AfterDeal *Unix Do NowPos[0]=InStr(1,FileData[0],Chr$(13))-1 If NowPos[0]=-1 Then NowLine[0]=Mid$(FileData[0],1) FileData[0]="" ElseIf NowPos[0]=0 Then NowLine[0]="" FileData[0]=Mid$(FileData[0],2) Else NowLine[0]=Mid$(FileData[0],1,NowPos[0]) FileData[0]=Mid$(FileData[0],NowPos[0]+2) EndIf NowPos[1]=InStr(1,FileData[1],Chr$(13))-1 If NowPos[1]=-1 Then NowLine[1]=Mid$(FileData[1],1) FileData[1]="" ElseIf NowPos[1]=0 Then NowLine[1]="" FileData[1]=Mid$(FileData[1],2) Else NowLine[1]=Mid$(FileData[1],1,NowPos[1]) FileData[1]=Mid$(FileData[1],NowPos[1]+2) EndIf LineNo=LineNo+1 If NowLine[0]<>NowLine[1] Then InfoStr[0]=InfoStr[0]+Str$(LineNo)+"行目:"+NowLine[0]+Chr$(13)+Chr$(10) InfoStr[1]=InfoStr[1]+Str$(LineNo)+"行目:"+NowLine[1]+Chr$(13)+Chr$(10) EndIf NowLine[0]="" NowLine[1]="" Loop Until NowPos[0]=-1 OR NowPos[1]=-1 *AfterDeal If NowPos[0]=-1 AND NowPos[1]<>-1 Then InfoStr[1]=InfoStr[1]+Str$(LineNo+1)+"行目以降..." ElseIf NowPos[0]<>-1 AND NowPos[1]=-1 Then InfoStr[0]=InfoStr[0]+Str$(LineNo+1)+"行目以降..." EndIf If InfoStr[0]="" AND InfoStr[1]="" Then SendMessage(hEdit1,WM_SETTEXT,NULL,"同じ内容のファイルです。") SendMessage(hEdit2,WM_SETTEXT,NULL,"") Else SendMessage(hEdit1,WM_SETTEXT,NULL,InfoStr[0]) SendMessage(hEdit2,WM_SETTEXT,NULL,InfoStr[1]) EndIf EndSub '======================================== ' 相違点検索(その他) '======================================== Sub OtherSearch() Dim ReadData[1] As String Dim i As Long Dim Different As Long Dim FilePtr_0 As String Dim FilePtr_1 As String FilePtr_0=FileData[0] FilePtr_1=FileData[1] Do If FilePtr_0[i]<>FilePtr_1[i] Then Different=Different+1 EndIf i=i+1 Loop Until i=FileSize[0] OR i=FileSize[1] If FileSize[0]=i AND FileSize[1]<>i Then SendMessage(hEdit1,WM_SETTEXT,NULL,Str$(Different)+"/"+Str$(FileSize[0])+"バイトの違いがあります。"+Chr$(13)+Chr$(10)+"右のファイルサイズの方が"+Str$(FileSize[1]-FileSize[0])+"バイト大きいです。") SendMessage(hEdit2,WM_SETTEXT,NULL,"") ElseIf FileSize[0]<>i AND FileSize[1]=i Then SendMessage(hEdit1,WM_SETTEXT,NULL,Str$(Different)+"/"+Str$(FileSize[1])+"バイトの違いがあります。"+Chr$(13)+Chr$(10)+"左のファイルサイズの方が"+Str$(FileSize[0]-FileSize[1])+"バイト大きいです。") SendMessage(hEdit2,WM_SETTEXT,NULL,"") ElseIf Different>0 Then SendMessage(hEdit1,WM_SETTEXT,NULL,Str$(Different)+"/"+Str$(FileSize[0])+"バイトの違いがあります。"+Chr$(13)+Chr$(10)+"2つのファイルのサイズは同じです。") SendMessage(hEdit2,WM_SETTEXT,NULL,"") Else SendMessage(hEdit1,WM_SETTEXT,0,"同じ内容のファイルです。") SendMessage(hEdit2,WM_SETTEXT,0,"") EndIf EndSub '======================================== ' 相違点検索 '======================================== Sub Search() 'ファイル選択確認 If FileName[0]="" OR FileName[1]="" Then MessageBox(NULL,"ファイルの選択が不十分です。","FileChecker 1.1.0.0",MB_OK or MB_ICONEXCLAMATION) ExitSub EndIf 'ファイル1データ読み込み hFile[0]=CreateFile(FileName[0],GENERIC_READ,0,ByVal 0,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,0) FileSize[0]=GetFileSize(hFile[0],NULL) FileData[0]=String$(FileSize[0],Chr$(0)) ReadFile(hFile[0],FileData[0],FileSize[0],VarPtr(lpNumberOfBytesRead),ByVal NULL) CloseHandle(hFile[0]) 'ファイル2データ読み込み hFile[1]=CreateFile(FileName[1],GENERIC_READ,0,ByVal 0,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,0) FileSize[1]=GetFileSize(hFile[1],NULL) FileData[1]=String$(FileSize[1],Chr$(0)) ReadFile(hFile[1],FileData[1],FileSize[1],VarPtr(lpNumberOfBytesRead),ByVal 0) CloseHandle(hFile[1]) 'バイナリーチェック NullPoint1=InStr(1,FileData[0],Chr$(0)) NullPoint2=InStr(1,FileData[1],Chr$(0)) If NullPoint1=0 AND NullPoint2=0 Then TextSearch() Else OtherSearch() EndIf MessageBox(NULL,"比較が終了しました。","FileChecker 1.1.0.0",MB_OK) EndSub