VBA
Lavorare con file e directory senza utilizzare FileSystemObject
Ricerca…
Osservazioni
Scripting.FileSystemObject
è molto più robusto dei metodi legacy in questo argomento. Dovrebbe essere preferito in quasi tutti i casi.
Determinare se esistono cartelle e file
File:
Per determinare se esiste un file, basta passare il nome del file alla funzione Dir$
e testare per vedere se restituisce un risultato. Nota che Dir$
supporta le wild card, quindi per testare un file specifico , il pathName
passato deve essere testato per assicurarsi che non li contenga. L'esempio seguente genera un errore: se questo non è il comportamento desiderato, è possibile modificare la funzione per restituire semplicemente False
.
Public Function FileExists(pathName As String) As Boolean
If InStr(1, pathName, "*") Or InStr(1, pathName, "?") Then
'Exit Function 'Return False on wild-cards.
Err.Raise 52 'Raise error on wild-cards.
End If
FileExists = Dir$(pathName) <> vbNullString
End Function
Cartelle (metodo $ Dir):
La funzione Dir$()
può anche essere utilizzata per determinare se esiste una cartella specificando il passaggio di vbDirectory
per il parametro facoltativo degli attributes
. In questo caso, il valore pathName
passato deve terminare con un separatore di percorso ( \
), poiché i nomi di file corrispondenti causano falsi positivi. Tieni presente che le wild card sono consentite solo dopo l'ultimo separatore del percorso, quindi la funzione di esempio seguente genererà un errore 52 - "Nome file o numero di file errato" se l'input contiene una wild card. Se questo non è il comportamento desiderato, il commento On Error Resume Next
nella parte superiore della funzione. Ricorda inoltre che Dir$
supporta i percorsi dei file relativi (ad esempio ..\Foo\Bar
), pertanto i risultati sono validi solo se la directory di lavoro corrente non viene modificata.
Public Function FolderExists(ByVal pathName As String) As Boolean
'Uncomment the "On Error" line if paths with wild-cards should return False
'instead of raising an error.
'On Error Resume Next
If pathName = vbNullString Or Right$(pathName, 1) <> "\" Then
Exit Function
End If
FolderExists = Dir$(pathName, vbDirectory) <> vbNullString
End Function
Cartelle (metodo ChDir):
L'istruzione ChDir
può anche essere utilizzata per verificare se esiste una cartella. Nota che questo metodo cambierà temporaneamente l'ambiente in cui VBA è in esecuzione, quindi se questa è una considerazione, dovrebbe essere usato il metodo Dir$
. Ha il vantaggio di essere molto meno indulgente con i suoi parametri. Questo metodo supporta anche i percorsi dei file relativi, quindi ha lo stesso avvertimento del metodo Dir$
.
Public Function FolderExists(ByVal pathName As String) As Boolean
'Cache the current working directory
Dim cached As String
cached = CurDir$
On Error Resume Next
ChDir pathName
FolderExists = Err.Number = 0
On Error GoTo 0
'Change back to the cached working directory.
ChDir cached
End Function
Creazione ed eliminazione di cartelle di file
NOTA: per brevità, gli esempi seguenti utilizzano la funzione FolderExists dall'esempio Determinare se le cartelle e i file esistono in questo argomento.
L'istruzione MkDir
può essere utilizzata per creare una nuova cartella. Accetta percorsi contenenti lettere di unità ( C:\Foo
), nomi UNC ( \\Server\Foo
), percorsi relativi ( ..\Foo
) o la directory di lavoro corrente ( Foo
).
Se viene omessa l'unità o il nome UNC (ad es. \Foo
), la cartella viene creata nell'unità corrente. Questo potrebbe essere o meno la stessa unità della directory di lavoro corrente.
Public Sub MakeNewDirectory(ByVal pathName As String)
'MkDir will fail if the directory already exists.
If FolderExists(pathName) Then Exit Sub
'This may still fail due to permissions, etc.
MkDir pathName
End Sub
L'istruzione RmDir
può essere utilizzata per eliminare le cartelle esistenti. Accetta percorsi nelle stesse forme di MkDir
e utilizza la stessa relazione con la directory di lavoro e l'unità correnti. Si noti che l'istruzione è simile al comando di Windows rd
shell, pertanto verrà generato un errore 75 di run-time: "Errore di accesso al percorso / file" se la directory di destinazione non è vuota.
Public Sub DeleteDirectory(ByVal pathName As String)
If Right$(pathName, 1) <> "\" Then
pathName = pathName & "\"
End If
'Rmdir will fail if the directory doesn't exist.
If Not FolderExists(pathName) Then Exit Sub
'Rmdir will fail if the directory contains files.
If Dir$(pathName & "*") <> vbNullString Then Exit Sub
'Rmdir will fail if the directory contains directories.
Dim subDir As String
subDir = Dir$(pathName & "*", vbDirectory)
Do
If subDir <> "." And subDir <> ".." Then Exit Sub
subDir = Dir$(, vbDirectory)
Loop While subDir <> vbNullString
'This may still fail due to permissions, etc.
RmDir pathName
End Sub