home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 1_2002.ISO / Data / Zips / CODE_UPLOAD13540182001.psc / clsFileOps.cls next >
Encoding:
Visual Basic class definition  |  2001-01-02  |  16.5 KB  |  586 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "clsFileOps"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. ' Module      : modShellFileDisk
  15. ' Description : Routines for working with the Windows 95/NT 4.0 shell
  16. ' Source      : Total VB SourceBook 6
  17. '
  18.  
  19. Option Explicit
  20.  
  21.  
  22. Private Type BrowseInfo
  23.     hWndOwner      As Long
  24.     pIDLRoot       As Long
  25.     pszDisplayName As Long
  26.     lpszTitle      As Long
  27.     ulFlags        As Long
  28.     lpfnCallback   As Long
  29.     lParam         As Long
  30.     iImage         As Long
  31. End Type
  32.  
  33. Private Const BIF_RETURNONLYFSDIRS = 1
  34. Private Const MAX_PATH = 260
  35.  
  36. Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
  37. Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
  38. Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
  39. Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
  40.  
  41.  
  42.  
  43.  
  44. Private Const CSIDL_DESKTOP = &H0
  45. Private Const CSIDL_PROGRAMS = &H2
  46. Private Const CSIDL_CONTROLS = &H3
  47. Private Const CSIDL_PRINTERS = &H4
  48. Private Const CSIDL_PERSONAL = &H5
  49. Private Const CSIDL_FAVORITES = &H6
  50. Private Const CSIDL_STARTUP = &H7
  51. Private Const CSIDL_RECENT = &H8
  52. Private Const CSIDL_SENDTO = &H9
  53. Private Const CSIDL_BITBUCKET = &HA
  54. Private Const CSIDL_STARTMENU = &HB
  55. Private Const CSIDL_DESKTOPDIRECTORY = &H10
  56. Private Const CSIDL_DRIVES = &H11
  57. Private Const CSIDL_NETWORK = &H12
  58. Private Const CSIDL_NETHOOD = &H13
  59. Private Const CSIDL_FONTS = &H14
  60. Private Const CSIDL_TEMPLATES = &H15
  61. Private Const CSIDL_COMMON_STARTMENU = &H16
  62. Private Const CSIDL_COMMON_PROGRAMS = &H17
  63. Private Const CSIDL_COMMON_STARTUP = &H18
  64. Private Const CSIDL_COMMON_DESKTOPDIRECTORY = &H19
  65. Private Const CSIDL_APPDATA = &H1A
  66. Private Const CSIDL_PRINTHOOD = &H1B
  67.  
  68. 'Private Const BIF_RETURNONLYFSDIRS = &H1
  69.  
  70.  
  71. Private Type SHITEMID
  72.   cb As Long
  73.   abID As Byte
  74. End Type
  75.  
  76. Private Type ITEMIDLIST
  77.   mkid As SHITEMID
  78. End Type
  79.  
  80. Private Type SHFILEOPSTRUCT
  81.   hWnd As Long
  82.   wFunc As Long
  83.   pFrom As String
  84.   pTo As String
  85.   fFlags As Integer
  86.   fAnyOperationsAborted As Long
  87.   hNameMappings As Long
  88.   lpszProgressTitle As String
  89. End Type
  90.  
  91. 'Private Declare Function SHGetPathFromIDList '  Lib "shell32.dll" '  Alias "SHGetPathFromIDListA" '  (ByVal pidl As Long, '   ByVal pszPath As String) '  As Long
  92.  
  93. Private Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" (ByVal hWndOwner As Long, ByVal nFolder As Long, pidl As ITEMIDLIST) As Long
  94.  
  95. Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
  96.  
  97.  
  98. Private Declare Sub SHAddToRecentDocs Lib "shell32.dll" (ByVal uFlags As Long, ByVal pszPath As String)
  99.  
  100. Private Declare Function SHFormatDrive Lib "shell32" (ByVal hWnd As Long, ByVal Drive As Long, ByVal fmtID As Long, ByVal options As Long) As Long
  101.    
  102. Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
  103.  
  104. 'Private Declare Sub CoTaskMemFree '  Lib "ole32.dll" '  (ByVal pv As Long)
  105.  
  106. Private Const FO_MOVE = &H1
  107. Private Const FO_COPY = &H2
  108. Private Const FO_DELETE = &H3
  109. Private Const FO_RENAME = &H4
  110.  
  111. Private Const FOF_MULTIDESTFILES = &H1
  112. Private Const FOF_CONFIRMMOUSE = &H2
  113. Private Const FOF_SILENT = &H4
  114. Private Const FOF_RENAMEONCOLLISION = &H8
  115. Private Const FOF_NOCONFIRMATION = &H10
  116. Private Const FOF_WANTMAPPINGHANDLE = &H20
  117.  
  118. Private Const FOF_ALLOWUNDO = &H40
  119. Private Const FOF_FILESONLY = &H80
  120. Private Const FOF_SIMPLEPROGRESS = &H100
  121. Private Const FOF_NOCONFIRMMKDIR = &H200
  122. Private Const FOF_NOERRORUI = &H400
  123. Private Const SHARD_PATH = &H2&
  124.  
  125. ' GetDriveType return values
  126. Private Const DRIVE_NO_ROOT_DIR = 1
  127. Private Const DRIVE_REMOVABLE = 2
  128. Private Const DRIVE_FIXED = 3
  129. Private Const DRIVE_REMOTE = 4
  130. Private Const DRIVE_CDROM = 5
  131. Private Const DRIVE_RAMDISK = 6
  132.  
  133. Private Const SHFMT_OPT_FULL = &H1
  134. Private Const SHFMT_OPT_SYSONLY = &H2
  135.  
  136. Public Enum eSplitPath
  137.  
  138.     eSplitPathGetDriveLetter = 0
  139.     eSplitPathGetFileName = 1
  140.     eSplitPathGetExtension = 2
  141.     eSplitPathGetFullPath = 3
  142.     
  143. End Enum
  144.  
  145.  
  146.  
  147. '__________________________________________________
  148. ' Scope  : Public
  149. ' Type   : Sub
  150. ' Name   : ShellCopyFile
  151. ' NOtes  : Copies a file or files to a single destination
  152. ' Params : lnghWnd - handle to window to serve as
  153. '             the parent for the dialog. Use a form's
  154. '             hWnd property for example
  155. '             strSource - file spec for files to copy
  156. '             strDestination - destination file name or directory
  157. '             fSilent - if true, no warnings are displayed
  158. '             strTitle - title of the progress dialog
  159. ' Returns: Nothing
  160. ' Desc   : The Sub uses parameters lnghWnd As Long, ByVal strSource As String, ByVal strDestination As String, Optional ByVal fSilent As Boolean = False and Optional strTitle As String = "Copying..." for ShellCopyFile and returns Nothing.
  161. '__________________________________________________
  162. ' History
  163. ' CDK: 20010102: Added Error Trapping & Comments
  164. '__________________________________________________
  165. Public Sub ShellCopyFile(lnghWnd As Long, ByVal strSource As String, ByVal strDestination As String, Optional ByVal fSilent As Boolean = False, Optional strTitle As String = "Copying...")
  166.   
  167.   Dim foCopy As SHFILEOPSTRUCT
  168.   Dim lngFlags As Long
  169.   Dim lngResult As Long
  170.     
  171.   On Error GoTo Proc_Err
  172.   
  173.   ' check to be sure file exists
  174.   If Dir$(strSource) <> "" Then
  175.     
  176.     ' set flags for no prompting
  177.     If fSilent Then
  178.       lngFlags = FOF_NOCONFIRMMKDIR Or FOF_NOCONFIRMATION Or FOF_SILENT
  179.     End If
  180.     
  181.     ' set shell file operations settings
  182.     With foCopy
  183.       .hWnd = lnghWnd
  184.       .pFrom = strSource
  185.       .pTo = strDestination
  186.       .fFlags = lngFlags
  187.       .lpszProgressTitle = strTitle
  188.       .wFunc = FO_COPY
  189.       
  190.       lngResult = SHFileOperation(foCopy)
  191.     
  192.     End With
  193.     
  194.   End If
  195.  
  196. Proc_Exit:
  197.   Exit Sub
  198.  
  199. Proc_Err:
  200.   MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
  201.     "ShellCopyFile"
  202.   Resume Proc_Exit
  203.  
  204. End Sub
  205.  
  206.  
  207. '__________________________________________________
  208. ' Scope  : Public
  209. ' Type   : Sub
  210. ' Name   : ShellRenameFile
  211. ' Params : lnghWnd - handle to window to serve as
  212. '             the parent for the dialog. Use a form's
  213. '             hWnd property for example
  214. '             sOldName - old file name
  215. '             sNewName - new file name
  216. '             fSilent - if true, no warnings are displayed
  217. '             strTitle - title of the progress dialog
  218. ' Returns: Nothing
  219. ' Desc   : The Sub uses parameters  for ShellRenameFile and returns _.
  220. '__________________________________________________
  221. ' History
  222. ' CDK: 20010102: Added Error Trapping & Comments
  223. '__________________________________________________
  224. Public Sub ShellRenameFile( _
  225.   lnghWnd As Long, _
  226.   ByVal sOldName As String, _
  227.   ByVal sNewName As String, _
  228.   Optional ByVal fSilent As Boolean = False, _
  229.   Optional strTitle As String = "Copying...")
  230.   ' Comments  : Copies a file or files to a single destination
  231.   ' Returns   : Nothing
  232.   ' Source    : Total VB SourceBook 6
  233.   '
  234.   Dim foRename As SHFILEOPSTRUCT
  235.   Dim lngFlags As Long
  236.   Dim lngResult As Long
  237.     
  238.   On Error GoTo Proc_Err
  239.   
  240.   ' check to be sure file exists
  241.   If Dir$(sOldName) <> "" Then
  242.     
  243.     ' set flags for no prompting
  244.     If fSilent Then
  245.       lngFlags = FOF_NOCONFIRMMKDIR Or FOF_NOCONFIRMATION Or FOF_SILENT
  246.     End If
  247.     
  248.     ' set shell file operations settings
  249.     With foRename
  250.       .hWnd = lnghWnd
  251.       .pFrom = sOldName
  252.       .pTo = sNewName
  253.       .fFlags = lngFlags
  254.       .lpszProgressTitle = strTitle
  255.       .wFunc = FO_RENAME
  256.       
  257.       lngResult = SHFileOperation(foRename)
  258.     
  259.     End With
  260.     
  261.   End If
  262.  
  263. Proc_Exit:
  264.   Exit Sub
  265.  
  266. Proc_Err:
  267.   MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
  268.     "ShellCopyFile"
  269.   Resume Proc_Exit
  270.  
  271. End Sub
  272.  
  273.  
  274.  
  275.  
  276.  
  277. '__________________________________________________
  278. ' Scope  : Public
  279. ' Type   : Function
  280. ' Name   : BrowseForFolderPf
  281. ' Params :
  282. '          hWndOwner As Long
  283. '          sPrompt As String
  284. ' Returns: String
  285. ' Desc   : The Function uses parameters hWndOwner As Long and sPrompt As String for BrowseForFolderPf and returns String.
  286. '__________________________________________________
  287. ' History
  288. ' CDK: 20010102: Added Error Trapping & Comments
  289. '__________________________________________________
  290. Public Function BrowseForFolderPf(hWndOwner As Long, sPrompt As String) As String
  291.     On Error GoTo Proc_Err
  292.     Const csProcName As String = "BrowseForFolderPf"
  293.  
  294.  
  295.     Dim iNull As Integer
  296.     Dim lpIDList As Long
  297.     Dim lResult As Long
  298.     Dim sPath As String
  299.     Dim udtBI As BrowseInfo
  300.  
  301.     With udtBI
  302.         .hWndOwner = hWndOwner
  303.         .lpszTitle = lstrcat(sPrompt, "")
  304.         .ulFlags = BIF_RETURNONLYFSDIRS
  305.     End With
  306.  
  307.     lpIDList = SHBrowseForFolder(udtBI)
  308.     If lpIDList Then
  309.         sPath = String$(MAX_PATH, 0)
  310.         lResult = SHGetPathFromIDList(lpIDList, sPath)
  311.         Call CoTaskMemFree(lpIDList)
  312.         iNull = InStr(sPath, vbNullChar)
  313.         If iNull Then
  314.             sPath = Left$(sPath, iNull - 1)
  315.         End If
  316.     End If
  317.  
  318.     BrowseForFolderPf = sPath
  319.  
  320.  
  321. Proc_Exit:
  322.     GoSub Proc_Cleanup
  323.     Exit Function
  324.  
  325. Proc_Cleanup:
  326.     On Error Resume Next
  327.     'Place any cleanup of instantiated objects here
  328.     
  329.     On Error GoTo 0
  330.     Return
  331.  
  332. Proc_Err:
  333.     Dim lErrNum As String, sErrSource As String, sErrDesc As String
  334.     lErrNum = VBA.Err.Number
  335.     sErrSource = VBA.Err.Source & vbCrLf & "clsFileOps->" & csProcName
  336.     sErrDesc = VBA.Err.Description
  337.     Resume Proc_Err_Continue
  338.     
  339. Proc_Err_Continue:
  340.     GoSub Proc_Cleanup
  341.     Err.Raise Number:=lErrNum, Source:=sErrSource, Description:=sErrDesc
  342.     Exit Function
  343.  
  344. End Function
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353. '__________________________________________________
  354. ' Scope  : Public
  355. ' Type   : Function
  356. ' Name   : FilesToArray
  357. ' Desc   : Populates the passed array with a list of files in the
  358. '             specified directory
  359. ' Params : sDirectory - Directory to read
  360. '             fIncludeHidden - True to include hidden files
  361. '             fIncludeSystem - True to include system files
  362. '             asArray() - Array to hold file names (0-based)
  363. ' Returns: Number of files in the directory' Desc   : The Function uses parameters  for FilesToArray and returns _.
  364. '__________________________________________________
  365. ' History
  366. ' CDK: 20010102: Added Error Trapping & Comments
  367. '__________________________________________________
  368. Public Function FilesToArray( _
  369.   sDirectory As String, _
  370.   fIncludeHidden As Boolean, _
  371.   fIncludeSystem As Boolean, _
  372.   asArray() As String) _
  373.   As Integer
  374.   
  375.   
  376.   Dim intCounter As Integer
  377.   Dim strTmp As String
  378.   Dim lngAttr As Long
  379.   
  380.   On Error GoTo Proc_Err
  381.  
  382.   ' Build up the options flag
  383.   lngAttr = VBA.vbNormal
  384.   
  385.   If fIncludeHidden Then
  386.     lngAttr = lngAttr + VBA.vbHidden
  387.   End If
  388.   
  389.   If fIncludeSystem Then
  390.     lngAttr = lngAttr + VBA.vbSystem
  391.   End If
  392.   
  393.   ' Make sure there is a trailing slash
  394.   If Right$(sDirectory, 1) <> "\" Then
  395.     sDirectory = sDirectory & "\"
  396.   End If
  397.   
  398.   ' Get the first entry
  399.   strTmp = Dir(sDirectory, lngAttr)
  400.   
  401.   ' Loop through each entry
  402.   Do Until strTmp = ""
  403.  
  404.     ' Are there entries left?
  405.     If strTmp <> "" Then
  406.       ' Grow the array and add the item
  407.       ReDim Preserve asArray(intCounter)
  408.       asArray(intCounter) = strTmp
  409.       intCounter = intCounter + 1
  410.     End If
  411.     strTmp = Dir
  412.   Loop
  413.  
  414.   ' Return the count
  415.   FilesToArray = intCounter
  416.  
  417. Proc_Exit:
  418.   Exit Function
  419.   
  420. Proc_Err:
  421.   MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
  422.     "FilesToArray"
  423.   Resume Proc_Exit
  424.  
  425. End Function
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432. '__________________________________________________
  433. ' Scope  : Public
  434. ' Type   : Function
  435. ' Name   : PathFromFullPathPs
  436. ' Params :
  437. '          ByVal strPath As String - path minus the file name if there is one
  438. ' Returns: String
  439. ' Desc   : The Function uses parameters ByVal strPath As String for PathFromFullPathPs and returns String.
  440. '__________________________________________________
  441. ' History
  442. ' CDK: 20010102: Added Error Trapping & Comments
  443. '__________________________________________________
  444. Public Function PathFromFullPathPs(ByVal strPath As String) As String
  445.   
  446.   Dim intPos As Integer
  447.   Dim strTmp As String
  448.   
  449.   On Error GoTo Proc_Err
  450.   
  451.   ' Initialize return value
  452.   strTmp = ""
  453.   
  454.     'remove all after the last "\"
  455.     intPos = InStrRev(strPath, "\")
  456.     'strPath = Right(strPath, Len(strPath) - intPos)
  457.     strTmp = Left(strPath, intPos - 1)
  458.         
  459. Proc_Exit:
  460.   PathFromFullPathPs = strTmp
  461.   Exit Function
  462.   
  463. Proc_Err:
  464.   MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
  465.     "PathFromFullPathPs"
  466.   Resume Proc_Exit
  467.   
  468. End Function
  469.  
  470.  
  471.  
  472.                         
  473.  
  474.  
  475.  
  476. '__________________________________________________
  477. ' Scope  : Public
  478. ' Type   : Function
  479. ' Name   : SplitPathPs
  480. ' Params :
  481. '          ByVal sFileNameWithPath As String
  482. '          eReturnType As eSplitPath
  483. ' Returns: String
  484. ' Desc   : The Function uses parameters ByVal sFileNameWithPath As String and eReturnType As eSplitPath for SplitPathPs and returns String.
  485. '__________________________________________________
  486. ' History
  487. ' CDK: 20010102: Added Error Trapping & Comments
  488. '__________________________________________________
  489. Public Function SplitPathPs(ByVal sFileNameWithPath As String, eReturnType As eSplitPath) As String
  490.     On Error GoTo Proc_Err
  491.     Const csProcName As String = "SplitPathPs"
  492.  
  493.     
  494.     Dim sDriveLetter As String
  495.     Dim sDirPath As String
  496.     Dim sFileName As String
  497.     Dim sExtension As String
  498.     Dim lPathLength As Long
  499.     Dim lOffset As Long
  500.     Dim lThisLength As Long
  501.     Dim fFileNameFound As Boolean
  502.     
  503.     sDriveLetter = ""
  504.     sDirPath = ""
  505.     sFileName = ""
  506.     sExtension = ""
  507.  
  508.  
  509.     If Mid(sFileNameWithPath, 2, 1) = ":" Then ' Find the drive letter.
  510.         sDriveLetter = Left(sFileNameWithPath, 2)
  511.         sFileNameWithPath = Mid(sFileNameWithPath, 3)
  512.     End If
  513.     lPathLength = Len(sFileNameWithPath)
  514.  
  515.  
  516.     For lOffset = lPathLength To 1 Step -1 ' Find the Next delimiter.
  517.  
  518.  
  519.         Select Case Mid(sFileNameWithPath, lOffset, 1)
  520.             
  521.             Case "."
  522.                 ' This indicates either an sExtension or a . or a ..
  523.                 lThisLength = Len(sFileNameWithPath) - lOffset
  524.                 If lThisLength >= 1 And lThisLength <= 3 Then ' sExtension
  525.                     sExtension = Mid(sFileNameWithPath, lOffset, lThisLength + 1)
  526.                 End If
  527.                 sFileNameWithPath = Left(sFileNameWithPath, lOffset - 1)
  528.             
  529.             Case "\"
  530.                 ' This indicates a path delimiter.
  531.                 lThisLength = Len(sFileNameWithPath) - lOffset
  532.                 If lThisLength >= 1 And lThisLength <= 40 Then ' sFileName
  533.                     sFileName = Mid(sFileNameWithPath, lOffset + 1, lThisLength)
  534.                     sDirPath = Left(sFileNameWithPath, lOffset)
  535.                     fFileNameFound = True
  536.                     Exit For
  537.                 End If
  538.             
  539.         End Select
  540.         
  541.     Next lOffset
  542.  
  543.     
  544.     Select Case eReturnType
  545.         Case eSplitPath.eSplitPathGetFileName
  546.             SplitPathPs = sFileName & sExtension
  547.         
  548.         Case eSplitPath.eSplitPathGetFullPath
  549.             SplitPathPs = sDriveLetter & sDirPath
  550.         
  551.         Case eReturnType = eSplitPath.eSplitPathGetExtension
  552.             SplitPathPs = sExtension
  553.         
  554.         Case eReturnType = eSplitPath.eSplitPathGetDriveLetter
  555.             SplitPathPs = sDriveLetter
  556.     
  557.     End Select
  558.  
  559.  
  560. Proc_Exit:
  561.     GoSub Proc_Cleanup
  562.     Exit Function
  563.  
  564. Proc_Cleanup:
  565.     On Error Resume Next
  566.     'Place any cleanup of instantiated objects here
  567.     
  568.     On Error GoTo 0
  569.     Return
  570.  
  571. Proc_Err:
  572.     Dim lErrNum As String, sErrSource As String, sErrDesc As String
  573.     lErrNum = VBA.Err.Number
  574.     sErrSource = VBA.Err.Source & vbCrLf & "clsFileOps->" & csProcName
  575.     sErrDesc = VBA.Err.Description
  576.     Resume Proc_Err_Continue
  577.     
  578. Proc_Err_Continue:
  579.     GoSub Proc_Cleanup
  580.     Err.Raise Number:=lErrNum, Source:=sErrSource, Description:=sErrDesc
  581.     Exit Function
  582.  
  583. End Function
  584.  
  585.  
  586.