Announcement

Collapse

Forum Guidelines

This forum is for finished source code that is working properly. If you have questions about this or any other source code, please post it in one of the Discussion Forums, not here.
See more
See less

Open-Files Lister with Snapshot Compare Feature - for PBWin7

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Open-Files Lister with Snapshot Compare Feature - for PBWin7

    Code:
    '**************************************
    '   "OpenFiles.bas"
    
    [B][SIZE="3"][COLOR="Red"]'Open-Files Lister 
    with Snapshot Compare Feature[/COLOR]
    
    'Notes:[/SIZE][/B]
    
    [COLOR="Blue"]' Typical usage for finding out which files a program uses:
    '1) Press "Refresh" to fill the "All" textbox with all files which
    '	are currently open.
    '2) Open the program of interest, allowing it to load completely.
    '3) Press "Compare" to fill the "New" textbox with newly loaded files.
    
    '*	"Refresh" always lists every file open at the time it's pressed.
    '*	"Compare" gets a list of all open files from Windows then lists
    '	only the ones which don't appear in the previously made main list.
    '	In other words, it doesn't show which files in the main list have
    '	been closed since the last "Refresh".[/COLOR]
    
    
    
    [COLOR="Olive"][B]'		Ideas for Improvement:[/B]
    
    '*	Cummulative listing with de-duplication to keep track of all files 
    '	ever opened
    '*	Show which files were closed for compares
    '*	Compare any list with any other list, including any provided by 
    '	the user.
    '*	Filter by location, file type, time stamps and other properties.
    '*	Show which processes have which files open programatically (without 
    '	requiring the above "Compare" method)[/COLOR]
    
    
    'Public domain by TheirCorp
    '**************************************
    
    #Compile Exe "OpenFiles.exe"
    #Dim All
    
    
    
    '**************************************
    'this is an InClean file included inline
    '**************************************
    ' Created by inClean v1.25, 09-28-2007, 11:55:30
    ' Press Help-button for some useful information and tips.
    '
    '  24282 lines of include file data read and compared against
    '    279 lines of code in 0.88 seconds.
    '
    '-----------------------------------------------------------------
    ' Equates:  41
    '-----------------------------------------------------------------
    
    %WINAPI						= 1
    %Null						= 0
    %Normal						= &B000000
    %Hidden						= &B000010
    %System						= &B000100
    %SubDir						= &B010000
    %INVALID_HANDLE_VALUE		= &HFFFFFFFF???
    %FILE_FLAG_DELETE_ON_CLOSE  = &H004000000
    %VWIN32_DIOC_DOS_IOCTL		= 1 ' DOS IOCTL commands
    %MAX_PATH					= 260 ' max. length of full pathname
    %WM_NCACTIVATE				= &H86
    %WM_INITDIALOG				= &H110
    %WM_COMMAND					= &H111
    %WS_POPUP					= &H80000000
    %WS_CHILD					= &H40000000
    %WS_VISIBLE					= &H10000000
    %WS_CLIPSIBLINGS			= &H04000000
    %WS_CAPTION					= &H00C00000 ' WS_BORDER OR WS_DLGFRAME
    %WS_BORDER					= &H00800000
    %WS_DLGFRAME				= &H00400000
    %WS_VSCROLL					= &H00200000
    %WS_HSCROLL					= &H00100000
    %WS_SYSMENU					= &H00080000
    %WS_TABSTOP					= &H00010000
    %WS_MINIMIZEBOX				= &H00020000
    %WS_EX_CLIENTEDGE			= &H00000200
    %WS_EX_LEFT					= &H00000000
    %WS_EX_LTRREADING			= &H00000000
    %WS_EX_RIGHTSCROLLBAR		= &H00000000
    %WS_EX_CONTROLPARENT		= &H00010000
    %HWND_DESKTOP				= 0
    %ES_LEFT					= &H0&
    %ES_MULTILINE				= &H4&
    %ES_AUTOHSCROLL				= &H80&
    %ES_WANTRETURN				= &H1000&
    %BN_CLICKED					= 0
    %DS_3DLOOK					= &H0004&
    %DS_NOFAILCREATE			= &H0010&
    %DS_SETFONT					= &H0040& ' User specified font for Dlg controls
    %DS_MODALFRAME				= &H0080& ' Can be combined with WS_CAPTION
    %DS_CENTER					= &H0800&
    
    '-----------------------------------------------------------------
    ' TYPE and UNION structures:  6
    '-----------------------------------------------------------------
    Type OVERLAPPED
    	Internal As Dword
    	InternalHigh As Dword
    	offset As Dword
    	OffsetHigh As Dword
    	hEvent As Dword
    End Type
    
    Type SECURITY_ATTRIBUTES
    	nLength As Dword
    	lpSecurityDescriptor As Long
    	bInheritHandle As Long
    End Type
    
    Type FILETIME
    	dwLowDateTime As Dword
    	dwHighDateTime As Dword
    End Type
    
    Type BY_HANDLE_FILE_INFORMATION
    	dwFileAttributes As Dword
    	ftCreationTime As FILETIME
    	ftLastAccessTime As FILETIME
    	ftLastWriteTime As FILETIME
    	dwVolumeSerialNumber As Dword
    	nFileSizeHigh As Dword
    	nFileSizeLow As Dword
    	nNumberOfLinks As Dword
    	nFileIndexHigh As Dword
    	nFileIndexLow As Dword
    End Type
    
    Type DIOC_REGISTERS
    	regEBX As Dword
    	regEDX As Dword
    	regECX As Dword
    	regEAX As Dword
    	regEDI As Dword
    	regESI As Dword
    	regFlags As Dword
    End Type
    
    Type WIN32_FIND_DATA
    	dwFileAttributes As Dword
    	ftCreationTime As FILETIME
    	ftLastAccessTime As FILETIME
    	ftLastWriteTime As FILETIME
    	nFileSizeHigh As Dword
    	nFileSizeLow As Dword
    	dwReserved0 As Dword
    	dwReserved1 As Dword
    	cFileName As Asciiz * %MAX_PATH
    	cAlternateFileName As Asciiz * 14
    End Type
    
    '-----------------------------------------------------------------
    ' Declared Functions:  7
    '-----------------------------------------------------------------
    Declare Function CreateFile Lib "KERNEL32.DLL" Alias "CreateFileA" (lpFileName As Asciiz, ByVal dwDesiredAccess As Dword, ByVal dwShareMode As Dword, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Dword, _
    	ByVal dwFlagsAndAttributes As Dword, ByVal hTemplateFile As Dword) As Dword
    Declare Function DeviceIoControl Lib "KERNEL32.DLL" Alias "DeviceIoControl" (ByVal hDevice As Dword, ByVal dwIoControlCode As Dword, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, _
    	lpBytesReturned As Long, lpOverlapped As OVERLAPPED) As Long
    Declare Function FindClose Lib "KERNEL32.DLL" Alias "FindClose" (ByVal hFindFile As Dword) As Long
    Declare Function FindFirstFile Lib "KERNEL32.DLL" Alias "FindFirstFileA" (lpFileName As Asciiz, lpFindFileData As WIN32_FIND_DATA) As Dword
    Declare Function GetFocus Lib "USER32.DLL" Alias "GetFocus" () As Dword
    Declare Function GetLogicalDrives Lib "KERNEL32.DLL" Alias "GetLogicalDrives" () As Long
    Declare Function SetFocus Lib "USER32.DLL" Alias "SetFocus" (ByVal hWnd As Dword) As Long
    
    '**************************************
    '	end if InClean file
    '**************************************
    
    
    
    %Dlg	 =  101
    %RefBtn  = 1001
    %CompBtn = 1002
    %AllLbl  = 1003
    %AllTxt  = 1004
    %NewLbl  = 1005
    %NewTxt  = 1006
    
    $Caption	= "Open File Lister"
    
    Global ghDlg	As Dword
    
    '**************************************
    
    Sub CompareList(ps1() As String, ps2() As String)
    Local i			As Long
    Local fExist	As Long
    
    	Do Until i = UBound(ps1)
    
    		If Len(ps1(i)) Then
    
    			Array Scan ps2(), Collate UCase, = ps1(i), To fExist
    			If fExist Then
    				Array Delete ps1(i)
    				Iterate Do
    			End If
    
    		End If
    
    		Incr i
    
    	Loop
    
    	Array Scan ps1(), = "", To i
    	If i Then ReDim Preserve ps1(i - 1)
    
    End Sub 'CompareList
    
    '**************************************
    'returns the total of all file sizes
    'this assumes that not even the total of the 
    'file sizes will over flow a Quad variable
    Function FileSizes(ps() As String, sz() As Dword) As Quad
    Local i			As Long
    Local qt		As Long 'total of file sizes
    
    Local hFind		As Dword
    Local wfd		As WIN32_FIND_DATA
    
    	ReDim sz(UBound(ps))
    
    	For i = 0 To UBound(ps)
    
    		If Len(ps(i)) And Len(Dir$(ps(i))) Then
    
    			hFind = FindFirstFile(ByVal StrPtr(ps(i)), wfd)
    			If hFind <> %INVALID_HANDLE_VALUE Then
    				sz(i) = wfd.nFileSizeLow
    				qt = qt + sz(i)
    				FindClose(hFind)
    			End If
    
    		End If
    
    	Next i
    
    	Function = qt
    
    End Function 'FileSizes
    
    '**************************************
    'This only corrects the capitalization of the portions it expands.
    'returns the change in length of original string
    ' A value of -1 indicates an error
    'this should check for the system's character for
    'converting long file names to short ones
    Function MakeLongPathName(ps As String) As Long
    Local a		As Long
    Local n		As Long
    Local p1	As Long
    Local p2	As Long
    Local ls	As String
    
    	ps = Trim$(ps, Any $Nul & $Spc)
    	a = Len(ps)
    
    	Do
    		n = InStr(n + 1, ps, "~")
    
    		If n Then
    
    			p1 = InStr(n - Len(ps), ps, "\")
    			p2 = InStr(n, ps, "\") : p2 = IIf&(p2, p2, Len(ps) + 1)
    			ls = Dir$(Left$(ps, p2 - 1), %NORMAL Or %HIDDEN Or %SYSTEM Or %SUBDIR)
    
    			If Len(ls) Then
    				ps = Left$(ps, p1) & ls & Mid$(ps, p2)
    			Else
    				Function = -1
    				Exit Function
    			End If
    
    		End If
    
    	Loop While n
    
    	Function = Len(ps) - a
    
    End Function 'MakeLongPathName
    
    '**************************************
    'returns count of open files
    Function GetOpenFiles(ps() As String) As Long
    Local ct	As Long 'file count
    Local n		As Long
    Local p		As Dword
    Local d		As Long
    
    Local dn	As Long
    Local hf	As Long
    Local ls	As String
    Local ts	As String
    Local dr	As DIOC_REGISTERS
    Local bhfi  As BY_HANDLE_FILE_INFORMATION
    
    	p = GetLogicalDrives()
    	Do
    		If p Then Incr dn
    		Shift Right p, 1
    	Loop While p
    	If dn < 3 Then Exit Function
    
    	For dn = 3 To dn
    
    		n = 0
    
    		hf = CreateFile("\\.\vwin32", 0, 0, ByVal %Null, 0, %FILE_FLAG_DELETE_ON_CLOSE, %Null)
    		Do
    			ls = String$(%MAX_PATH, $Nul)
    			dr.regEBX	 = dn  '1-based drive number
    			dr.regEDX	 = StrPtr(ls)
    			dr.regECX	 = &H0486D
    			dr.regEAX	 = &H0440D
    			dr.regESI	 = n
    
    			Call DeviceIoControl(hf, %VWIN32_DIOC_DOS_IOCTL, dr, SizeOf(dr), dr, SizeOf(dr), d, ByVal %Null)
    
    			If (dr.regFlags And 1) Then Exit Do
    
    			MakeLongPathName(ls)
    
    			'avoid duplicates and keep only the most recently retreived occurrences
    			ls = ls & $CrLf
    			If InStr(ts, ls) Then ts = Remove$(ts, ls) Else Incr ct
    			ts = ts & ls
    
    			Incr n
    
    		Loop
    
    	Next dn
    
    	Function = ct 'return count of open files
    	ReDim Preserve ps(ParseCount(ts, $CrLf))
    	Parse ts, ps(), $CrLf
    
    End Function 'GetOpenFiles
    
    '**************************************
    
    CallBack Function ShowProc()
    Static AllFiles()	As String
    Static NewFiles()	As String
    Static sz()			As Dword 'sizes of files in NewFiles()
    Local  qt			As Quad  'total of file sizes
    Local i				As Long
    Local n				As Long
    Local ls			As String
    
    	Select Case As Long CbMsg
    		Case %WM_INITDIALOG
    			Dim NewFiles(0)
    			Dim AllFiles(0)
    			Dim sz(0)
    
    		Case %WM_NCACTIVATE
    			Static hWndSaveFocus As Dword
    			If IsFalse CbWParam Then
    				hWndSaveFocus = GetFocus()
    			ElseIf hWndSaveFocus Then
    				SetFocus(hWndSaveFocus)
    				hWndSaveFocus = 0
    			End If
    
    		Case %WM_COMMAND
    
    			Select Case As Long CbCtl
    
    				Case %RefBtn
    					If CbCtlMsg = %BN_CLICKED Or CbCtlMsg = 1 Then
    						n = GetOpenFiles(AllFiles())
    						ls = "Open files: " & Format$(n) & $CrLf & $CrLf & Join$(AllFiles(), $CrLf)
    						Control Set Text ghDlg, %AllTxt, ls
    					End If
    
    				Case %CompBtn
    					If CbCtlMsg = %BN_CLICKED Or CbCtlMsg = 1 Then
    						GetOpenFiles(NewFiles())
    						CompareList(NewFiles(), AllFiles())
    						qt = FileSizes(NewFiles(), sz())
    
    						For i = 0 To UBound(NewFiles)
    							If Len(NewFiles(i)) Then
    								Incr n 'get file count
    								ls = ls & NewFiles(i) & Space$(8) & Format$(sz(i), "0,") & $CrLf
    							End If
    						Next i
    
    						'prepend these in the reverse order that they'll appear
    						ls = "Total bytes: " & Format$(qt, "0,") & $CrLf & $CrLf & ls
    						ls = "New files: " & Format$(n, "0,") & $CrLf & ls
    						Control Set Text ghDlg, %NewTxt, ls
    
    					End If
    
    				Case 2 'cancel
    					Dialog End ghDlg
    
    			End Select
    
    	End Select
    
    End Function
    
    '**************************************
    
    Function PBMain()
    Local lRslt As Long
    
    	Dialog New %HWND_DESKTOP, $Caption, 218, 61, 321, 229, %WS_POPUP Or %WS_BORDER Or _
    		%WS_DLGFRAME Or %WS_CAPTION Or %WS_SYSMENU Or %WS_MINIMIZEBOX Or %WS_CLIPSIBLINGS Or _
    		%WS_VISIBLE Or %DS_MODALFRAME Or %DS_CENTER Or %DS_3DLOOK Or %DS_NOFAILCREATE Or _
    		%DS_SETFONT, %WS_EX_CONTROLPARENT Or %WS_EX_LEFT Or %WS_EX_LTRREADING Or _
    		%WS_EX_RIGHTSCROLLBAR, To ghDlg
    	Control Add Button,  ghDlg, %RefBtn, "&Refresh", 274, 10, 40, 14
    	Control Add Button,  ghDlg, %CompBtn, "&Compare", 274, 128, 40, 14
    	Control Add Label,   ghDlg, %AllLbl, "&All open files:", 2, 0, 265, 10
    	Control Add TextBox, ghDlg, %AllTxt, "", 2, 11, 265, 97, %WS_CHILD Or %WS_VISIBLE Or _
    		%WS_TABSTOP Or %WS_HSCROLL Or %WS_VSCROLL Or %ES_LEFT Or %ES_MULTILINE Or _
    		%ES_AUTOHSCROLL Or %ES_WANTRETURN, %WS_EX_CLIENTEDGE Or %WS_EX_LEFT Or %WS_EX_LTRREADING _
    		Or %WS_EX_RIGHTSCROLLBAR
    	Control Add Label,   ghDlg, %NewLbl, "&New open files and sizes in bytes:", 2, 118, 265, 10
    	Control Add TextBox, ghDlg, %NewTxt, "", 2, 128, 265, 97, %WS_CHILD Or %WS_VISIBLE Or _
    		%WS_TABSTOP Or %WS_HSCROLL Or %WS_VSCROLL Or %ES_LEFT Or %ES_MULTILINE Or _
    		%ES_AUTOHSCROLL Or %ES_WANTRETURN, %WS_EX_CLIENTEDGE Or %WS_EX_LEFT Or %WS_EX_LTRREADING _
    		Or %WS_EX_RIGHTSCROLLBAR
    
    	Dialog Show Modal ghDlg, Call ShowProc To lRslt
    
    	Function = lRslt
    
    End Function
    
    '**************************************

    • TheirCorp's SourceForge project
      includes:
    • API Helper --- a code generator for the Win32 API
    • BinEditPlus --- a decompiler and more
    • ComHelper --- a code generator for the COM programming
    • "Flex" --- an editor with novel features
    • GDI Debug --- catches programming errors that could lead
      to resource leaks
    • Import Monitor --- (an API hook) Intercepts and monitors
      calls to imported functions
    • Intricately Mergeable Templates
    • Jellyfish Pro enhancer plugin (adds drag-and-drop and more..)
    • TheirEdit --- an editor for PowerBASIC code
    • TheirNote --- a KeyNote clone
    • TheirSheet --- a spreadsheet
    • SrcFrmt --- a source code formatter
    • Tooltipper --- a tooltip code generator


    PowerBASIC article in Wikipedia
    Last edited by Tony Burcham; 8 Oct 2007, 09:21 PM.
    TheirCorp's projects at SourceForge

    TheirCorp's website

    sigpic
Working...
X