| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- Option Compare Database
- Option Private Module
- Option Explicit
- Private Declare Function PathIsRelative Lib "Shlwapi" _
- Alias "PathIsRelativeA" (ByVal Path As String) As Long
- Public Enum EMakeDirStatus
- ErrSuccess = 0
- ErrRelativePath
- ErrInvalidPathSpecification
- ErrDirectoryCreateError
- ErrSpecIsFileName
- ErrInvalidCharactersInPath
- End Enum
- Const MAX_PATH = 260
-
- ' Path/Directory of the current database file.
- Public Function ProjectPath() As String
- ProjectPath = CurrentProject.Path
- If Right$(ProjectPath, 1) <> "\" Then ProjectPath = ProjectPath & "\"
- End Function
- ' Path/Directory for source files
- Public Function SourcePath() As String
- SourcePath = ProjectPath & CurrentProject.name & ".src\"
- End Function
- ' Create folder `Path`. Silently do nothing if it already exists.
- Public Sub MkDirIfNotExist(ByVal Path As String)
- On Error GoTo MkDirIfNotexist_noop
- MkDir Path
- logger "MkDirIfNotExist", "INFO", "New dir created: " & Path
- MkDirIfNotexist_noop:
- On Error GoTo 0
- End Sub
- ' Delete a file if it exists.
- Public Sub DelIfExist(ByVal Path As String)
- On Error GoTo DelIfNotExist_Noop
- Kill Path
- logger "DelIfExist", "DEBUG", "Killed: " & Path
- DelIfNotExist_Noop:
- On Error GoTo 0
- End Sub
- ' Erase all *.`ext` files in `Path`.
- Public Sub ClearTextFilesFromDir(ByVal Path As String, ByVal Ext As String, Optional ByVal force As Boolean = False)
-
- '### 13/10/2016: add optimizer
- ' we don't want to clear the text files of the objects which will not be exported
- 'BUT we still want to clear obsolete files: see CleanDirs in optimizer
- If optimizer_activated() And Not force Then
- logger "ClearTextFilesFromDir", "INFO", "Optimizer on: sub aborted"
- Exit Sub
- End If
- '###
-
- logger "ClearTextFilesFromDir", "DEBUG", "Clear dir: " & Path & "*." & Ext
- Dim FSO As Object
- Set FSO = CreateObject("Scripting.FileSystemObject")
- If Not FSO.FolderExists(Path) Then Exit Sub
- On Error GoTo ClearTextFilesFromDir_noop
- If dir$(Path & "*." & Ext) <> vbNullString Then
- FSO.DeleteFile Path & "*." & Ext
- End If
-
- ClearTextFilesFromDir_noop:
- On Error GoTo 0
- End Sub
- Public Function DirExists(ByVal strPath As String) As Boolean
- On Error Resume Next
- DirExists = False
- DirExists = ((GetAttr(strPath) And vbDirectory) = vbDirectory)
- End Function
- Public Function FileExists(ByVal strPath As String) As Boolean
- On Error Resume Next
- FileExists = False
- FileExists = ((GetAttr(strPath) And vbDirectory) <> vbDirectory)
- End Function
-
- Function RecursiveMkDir(ByVal PathSpec As String) As EMakeDirStatus
- ' This function creates a series of nested directories. The parent of
- ' every directory is create before a subdirectory is created, allowing a
- ' folder path specification of any number of directories (as long as the
- ' total length is less than MAX_PATH.
-
- Dim FSO As Scripting.FileSystemObject
- Dim DD As Scripting.Drive
- Dim B As Boolean
- Dim Root As String
- Dim DirSpec As String
- Dim N As Long
- Dim M As Long
- Dim S As String
- Dim Directories() As String
-
- Set FSO = New Scripting.FileSystemObject
-
- ' ensure there are no invalid characters in spec.
- On Error Resume Next
- err.Clear
- S = dir(PathSpec, vbNormal)
- If err.Number <> 0 Then
- RecursiveMkDir = ErrInvalidCharactersInPath
- Exit Function
- End If
- On Error GoTo 0
-
- ' ensure we have an absolute path
- B = CBool(PathIsRelative(PathSpec))
- If B = True Then
- RecursiveMkDir = ErrRelativePath
- Exit Function
- End If
-
- ' if the directory already exists, get out with success.
- If FSO.FolderExists(PathSpec) = True Then
- RecursiveMkDir = ErrSuccess
- Exit Function
- End If
-
- ' get rid of trailing slash
- If Right(PathSpec, 1) = "\" Then
- PathSpec = Left(PathSpec, Len(PathSpec) - 1)
- End If
-
- ' ensure we don't have a filename
- N = InStrRev(PathSpec, "\")
- M = InStrRev(PathSpec, ".")
- If (N > 0) And (M > 0) Then
- If M > N Then
- ' period found after last slash
- RecursiveMkDir = ErrSpecIsFileName
- Exit Function
- End If
- End If
-
- If Left(PathSpec, 2) = "\\" Then
- ' UNC -> \\Server\Share\Folder...
- N = InStr(3, PathSpec, "\")
- N = InStr(N + 1, PathSpec, "\")
- Root = Left(PathSpec, N - 1)
- DirSpec = Mid(PathSpec, N + 1)
- Else
- ' Local or mapped -> C:\Folder....
- N = InStr(1, PathSpec, ":", vbBinaryCompare)
- If N = 0 Then
- RecursiveMkDir = ErrInvalidPathSpecification
- Exit Function
- End If
- Root = Left(PathSpec, N)
- DirSpec = Mid(PathSpec, N + 2)
- End If
- Set DD = FSO.GetDrive(Root)
- Directories = Split(DirSpec, "\")
- DirSpec = DD.Path
- For N = LBound(Directories) To UBound(Directories)
- DirSpec = DirSpec & "\" & Directories(N)
- If FSO.FolderExists(DirSpec) = False Then
- On Error Resume Next
- err.Clear
- FSO.CreateFolder (DirSpec)
- If err.Number <> 0 Then
- RecursiveMkDir = ErrDirectoryCreateError
- Exit Function
- End If
- End If
- Next N
- RecursiveMkDir = ErrSuccess
- End Function
|