2013-02-06 13 views
9

Dato il seguente frammento:C'è un modo per DIR (percorso) in VBA per gestire le stringhe più lunghe di 260?

Dim s As String: s = "S:\vic\bla\[..insert more here..]\data.xml" 
Debug.Print Len(s) 
Debug.Print Dir(s) 

Se Len(s) >= 260 Ricevo un errore che indica quanto segue:

Run-time error '53': 

File not found 

Se la stringa è inferiore a 260 funziona bene e mostra un comportamento previsto per entrambi trovati e non -File di file.

È possibile ottenere DIR che funziona con nomi di percorso lunghi (> 260)?

Note

  • File ristrutturare non è un'opzione

  • sto facendo funzionare questo in Excel 2007

+0

come una correzione a breve termine, è possibile ri-mappare la cartella più profondo è necessario per ottenere i file –

+0

si può elaborare? – Chris

+1

Perché hai bisogno di Dir? Nel tuo esempio non vengono mostrati caratteri jolly, quindi è possibile che FileSystemObject funzioni per te? – Fionnuala

risposta

3

Ecco alcuni codice che dovrebbe funzionare a prescindere dalla profondità di ... Fondamentalmente, specifica i percorsi relativi - in modo da non chiamano dir con un lunga serie

Function deepFileExists(longFileName As String) 
' slowly make your way to the deepest folder... 
' assuming "\" is used as separator 
' you could add some code to replace "/" with "\"... 

Dim pathFragment As String, currentDir As String 
Dim slash As Integer, lastSlash As Integer 

slash = InStr(1, longFileName, "\") 
lastSlash = 0 

pathFragment = Mid(longFileName, 1, slash - 1) 

currentDir = CurDir  ' save the current directory 
ChDrive pathFragment  ' making sure we have the right drive 
ChDir pathFragment & "\" ' be at the root of this drive's directory 

lastSlash = slash 
slash = InStr(slash + 1, longFileName, "\") 

While (slash > 0) 
    pathFragment = ".\" & Mid(longFileName, lastSlash + 1, slash - lastSlash) 
    ChDir pathFragment 
    'MsgBox "changing directory to " & pathFragment 
    lastSlash = slash 
    slash = InStr(slash + 1, longFileName, "\") 
Wend 

' now we can look for the file: 
Dim a 
a = Dir(Mid(longFileName, lastSlash + 1)) 
If Len(a) > 0 Then 
    deepFileExists = True 
Else 
    deepFileExists = False 
End If 

End Function 
+0

Ha svalutato questa risposta prima di provarla ... e non funziona nel mio caso :(Errore 76 "Percorso non trovato" sulla riga 'ChDir pathFragment' quando il percorso (assoluto) supera la soglia di 260 caratteri. – raph82

+0

@ raph82 - è strano ... che piattaforma stai usando (versione di OS, Office)? – Floris

+0

Windows XP e Office 2007. I file sono su un'unità di rete. – raph82

6

Poco mettere (per rispondere alla risposta come titolo): No. La funzione Dir di VBA semplicemente non funziona con i percorsi oltre i 260 caratteri.

Versione lunga: http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#maximum_path_length (e poi Ctrl + F e cercare "260")

massima lunghezza del percorso limitazione

Nel API di Windows (con alcune eccezioni discusse nei paragrafi successivi) , la lunghezza massima per un percorso è MAX_PATH, che è definita come 260 caratteri. Un percorso locale è strutturato nel seguente ordine: lettera di unità, due punti, barra rovesciata , componenti nome separati da barre rovesciate e un carattere null di terminazione. Ad esempio, il percorso massimo sull'unità D è "D: \ alcuni Stringa di percorso di 256 caratteri" dove "" rappresenta l'invisibile terminazione di carattere null per la codepage corrente del sistema. (I caratteri > <> vengono utilizzati qui per chiarezza visiva e non possono essere parte di una stringa di percorso valida.) Nota Le funzioni I/O file nell'API Windows convertono "/" in "\" come parte della conversione del nome in un nome in stile NT, tranne quando si utilizza il prefisso "\? \" come descritto nelle seguenti sezioni . L'API di Windows ha molte funzioni che hanno anche versioni Unicode per consentire un percorso di lunghezza estesa per un percorso totale massimo lunghezza di 32.767 caratteri. Questo tipo di percorso è composto da componenti separati da barre rovesciate, ciascuno fino al valore restituito in il parametro lpMaximumComponentLength della funzione GetVolumeInformation (questo valore è comunemente di 255 caratteri). Per specificare un percorso di lunghezza estesa , utilizzare il prefisso "\? \". Ad esempio, "\? \ D: \ very percorso lungo". Nota Il percorso massimo di 32.767 caratteri è approssimativo, perché il prefisso "\? \" Può essere esteso a una stringa più lunga dal sistema in fase di esecuzione e questa espansione si applica alla lunghezza totale .

Penso che la sezione relativa Win32 spazi dei nomi di file vale la pena dare una prova:

Per file di I/O, il "\ \?" Prefisso per una stringa di percorso racconta l'API di Windows per disabilitare tutto l'analisi delle stringhe e per inviare la stringa che segue direttamente al file system. Ad esempio, se il file system supporta percorsi e nomi di file di grandi dimensioni, è possibile superare i limiti MAX_PATH altrimenti applicati dalle API di Windows. Per ulteriori informazioni su sulla limitazione del percorso massimo normale, consultare la sezione Limitazione massima lunghezza percorso.

Ci deve essere una funzione API Win32 è possibile DECLARE e utilizzare, ma che non è tramite la funzione DIR. Spiacente, non ho un nome di percorso lungo a disposizione per testare qualcosa ...

2

Non ho i mezzi per testarlo, quindi tutto quello che hai sono alcune note approssimative su un possibile approccio.

''Reference: Windows Script Host Object Model 
Dim fs As New FileSystemObject 
Dim fl As Folder 
Dim fl2 As Folder 

Set fl = fs.GetFolder("Z:\Docs\test\ThisIsInOrderToCreate\ALongFilePath\") 
Set fl2 = fl.SubFolders("WithASubFolder") 
Debug.Print fl2.ShortPath 
For Each File In fl2.Files 
    If File.Name = "file.txt" Then 
     Debug.Print "Found" 
    End If 
Next 

''May be possible 
a = Dir(fl.ShortPath & "\file.*") 

Inoltre, per quanto riguarda commento di cui sopra:

Set WshNetwork = CreateObject("WScript.Network") 
WshNetwork.MapNetworkDrive "L:", "\\mydrive\share" 
''Important to destroy when you are finished 
Set WshNetwork = Nothing 
0

ho trovato questa pagina MS: Naming Files, Paths, and Namespaces

Limite lunghezza percorso massimo Nell'API di Windows (con alcune eccezioni discusse nei paragrafi seguenti), la lunghezza massima per un percorso è MAX_PATH, che è definita come 260 caratteri. Un percorso locale è strutturato nel seguente ordine: lettera di unità, due punti, barra rovesciata, componenti di nome separati da barre rovesciate e un carattere nullo di chiusura. Ad esempio, il percorso massimo sull'unità D è "D: \ una stringa di percorso di 256 caratteri" dove "" rappresenta il carattere nullo di terminazione invisibile per la codepage di sistema corrente. (I caratteri <> vengono utilizzati qui per chiarezza visiva e non possono far parte di una stringa di percorso valida.) Nota Le funzioni I/O file nell'API di Windows convertono "/" in "\" come parte della conversione del nome in un NT stile, tranne quando si utilizza il prefisso "\? \" come descritto nelle seguenti sezioni.

L'API di Windows ha molte funzioni che dispongono anche di versioni Unicode per consentire un percorso di lunghezza estesa per una lunghezza di percorso totale massima di 32.767 caratteri. Questo tipo di percorso è composto da componenti separati da barre retroverse, ciascuno fino al valore restituito nel parametro lpMaximumComponentLength della funzione GetVolumeInformation (questo valore è comunemente di 255 caratteri). Per specificare un percorso di lunghezza estesa, utilizzare il prefisso "\? \". Ad esempio, "\? \ D: \ percorso molto lungo". Nota Il percorso massimo di 32.767 caratteri è approssimativo, poiché il prefisso "\? \" Può essere esteso a una stringa più lunga dal sistema in fase di esecuzione e questa espansione si applica alla lunghezza totale.

Il prefisso "\? \" Può anche essere utilizzato con percorsi costruiti secondo la convenzione di denominazione universale (UNC). Per specificare un percorso di questo tipo utilizzando UNC, utilizzare il prefisso "\? \ UNC \". Ad esempio, "\? \ UNC \ server \ share", dove "server" è il nome del computer e "share" è il nome della cartella condivisa.Questi prefissi non sono usati come parte del percorso stesso. Indicano che il percorso deve essere passato al sistema con modifiche minime, il che significa che non è possibile utilizzare le barre in avanti per rappresentare i separatori di percorso o un punto per rappresentare la directory corrente o due punti per rappresentare la directory padre. Poiché non è possibile utilizzare il prefisso "\? \" Con un percorso relativo, i percorsi relativi sono sempre limitati a un totale di MAX_PATH caratteri.

Quindi, per un percorso UNC molto lungo, cambio l'inizio del percorso come mostrato di seguito e funziona.

Const MAX_PATH_LENGTH As Integer = 260 

    If Len(fname) > MAX_PATH_LENGTH Then 
     fname = "\\?\UNC\" & Mid$(fname, 3) 
    End If 
    Set fsoObject = New Scripting.FileSystemObject 
    FileExists = fsoObject.FileExists(fname) 
Problemi correlati