Determinare se una stringa rappresenta un file o una cartella

Ultima modifica: 27-05-2016

 

In alcuni casi è necessario esaminare una STRINGA per sapere se la stessa rappresenta:

Per far questo ci sono alcuni metodi.

Negli esempi sottostanti ho preferito usare delle funzioni personali, piuttosto che aggiungere codice nelle macro, per snellire ed accorciare il codice scritto nelle macro. Perciò perchè il tutto funzioni occorre avere sia la funzione che la macro che ad essa si riferisce.

 

Usare la funzione DIR

Nella macro:
Dopo aver dichiaratto le variabili e la matrice che mi occorrono creo una matrice per memorizzare tutte le cartelle complete del loro percorso ed i nomi dei files che voglio verificare.
Quindi inizio un ciclo sulla matrice Path()
Usando la funzione DIR() tento la lettura del dsco usando il nome della cartella e del nome del file.
Se il file non esiste mi viene restituita una stringa vuota ed il lavoro su quel file è terminato.
Se il file esiste mi viene restituito il suo nome. In questo caso chiamo la funzione personale per controllare se il nome restituito è un file o una cartella. Alla funzione passo, come argomenti, il nome della cartella ed il nome del file.

 

Nella funzione personale:

La funzione personale richiede due parametri:

con la - If (GetAttr(folder & strg) And vbDirectory) = vbDirectory Then - si controlla se la stringa rappresenta una cartella. Se non è una cartella è un file.
E' possibile eseguire questa verifica in modo così semplice perchè, se nella macro è stato stabilito che la stringa è vuota (nè file, nè cartella), non si giunge alla funzione personale.

Function FileOrFolder_with_DIR(folder As String, strg As String)
If (GetAttr(folder & strg) And vbDirectory) = vbDirectory Then
FileOrFolder_with_DIR = "cartella"
Else
FileOrFolder_with_DIR = "file"
End If
End Function
Sub check_if_file_exist()
Dim File As String, Attr, A
Dim Path(1 To 5, 1 To 2) As String

Path(1, 1) = "D:\miky\attivita\filesXLS\gestione_files\"
Path(1, 2) = "salvare file con nomevariabile"
Path(2, 1) = "D:\miky\attivita\filesXLS\gestione_files\"
Path(2, 2) = "Controllo.xls"
Path(3, 1) = "D:\miky\attivita\filesXLS\"
Path(3, 2) = "Designazioni_colora_se.xls"
Path(4, 1) = ""
Path(4, 2) = "una cosa"
Path(5, 1) = ""
Path(5, 2) = "cosa.xls"

For A = 1 To UBound(Path, 1)
File = Dir(Path(A, 1) & Path(A, 2), vbDirectory)
If File = "" Then
MsgBox "Il file non esiste"
Else
MsgBox Path(A, 2) & ": " & FileOrFolder_with_DIR(Path(A, 1), File)
End If
Next
End Sub

Nella tabella quo sotto vi è un elenco deile possibili costanti e valori da dare opzionalmente come argomento alla funzione DIR()

 

Costante Valore Descrizione
vbNormal 0 Normale
vbReadOnly 1 Sola lettura
vbHidden 2 Nascosto
vbSystem 4 File di sistema
vbDirectory 16 Directory o cartella
vbArchive 32 Il file è stato modificato dall'ultimo backup

 

Usare il modello File System Object (FSO)

È possibile utilizzare il metodo My.Computer.FileSystem.FileExists per determinare se un file specificato esiste.
Se l'applicazione non dispone di autorizzazioni sufficienti per leggere il file specificato, il metodo FileExists restituisce False indipendentemente dall'esistenza del percorso, il metodo non genera un'eccezione.

Nella macro:
Viene creata una matrice in cui vengono memorizzate alcune cartelle ed alcuni files completi del loro percorso.
Viene iniziato un ciclo sulla matrice File()
Viene chiamata la funzione personale passandole come argomento il nome del file completo del suo percorso.
Al ritorno dalla funzione si esamina il valore da essa restituita e viene visualizzato il giusto tipo della stringa inviata alla funzione

Nella funzione:

Come argomento accetta una stringa che contiene il percorso completo ed il nome del file o della cartella da verificare.

Il lavoro che si compie è semplice. Usando FileSystemObject:

Se non è nè l'uno nè l'altra non è un nome di file o cartella validi.

Function FileOrFolder(strg As String)
Dim fs, FExists, DirExists
FExists = CreateObject("Scripting.FileSystemObject").FileExists(strg)
DirExists = CreateObject("Scripting.FileSystemObject").FolderExists(strg)
If FExists = True Then
FileOrFolder = "file"
ElseIf DirExists = True Then
FileOrFolder = "folder"
Else
FileOrFolder = "invalid"
End If
End Function
Sub isFolder_isFile()
Dim Cosa, A
Dim File(1 To 5) As String

File(1) = "D:\miky\attivita\filesXLS\gestione_files\salvare file con nomevariabile"
File(2) = "D:\miky\attivita\filesXLS\gestione_files\Controllo.xls"
File(3) = "D:\miky\attivita\filesXLS\Designazioni_colora_se.xls"
File(4) = "una cosa"
File(5) = "cosa.xls"

For A = 1 To UBound(File)
Cosa = FileOrFolder(File(A))
Select Case Cosa
Case "file"
MsgBox File(A) & vbCrLf & " è un file"
Case "folder"
MsgBox File(A) & vbCrLf & " è una cartella"
Case "invalid"
MsgBox File(A) & vbCrLf & " non è valido"
End Select
Next
End Sub