2009-01-06 18 views
18

Aus verschiedenen Gründen bin ich in Access 97 stecken und muss nur den Pfad Teil eines vollständigen Pfades erhalten.Finden Sie den Verzeichnisteil (abzüglich des Dateinamens) eines vollständigen Pfades in Access 97

Zum Beispiel der Name

c:\whatever dir\another dir\stuff.mdb 

c:\whatever dir\another dir\ 

Diese Seite werden sollte hat einige Vorschläge, wie man es tun: http://www.ammara.com/access_image_faq/parse_path_filename.html

Aber sie scheinen ziemlich scheußlich. Es muss einen besseren Weg geben, oder?

+0

Was ist es abscheulich ist? Es sieht für mich ziemlich einfach aus und ich hatte meine eigenen Versionen für A97 geschrieben, die noch heute in Apps laufen, obwohl sie bessere eingebaute Funktionen bieten, als in A97 verfügbar waren. –

+0

Aus Fragen entfernt: Ist CurrentProject.Path in Access 97 verfügbar? – Fionnuala

+1

Antwort: Nein, CurrentProject fehlt vollständig in Access 97. Es gibt jedoch CurrentDb.Name, aber das ist der vollständige Pfad einschließlich Dateiname. - apenwarr – Fionnuala

Antwort

1

Das ist es. Es gibt keine magische eingebaute Funktion ...

16

Ich verwendete immer das FileSystemObject für diese Art Sache. Hier ist eine kleine Wrapper-Funktion, die ich benutzt habe. Achten Sie darauf, die Microsoft Scripting Runtime zu verweisen.

Function StripFilename(sPathFile As String) As String 

'given a full path and file, strip the filename off the end and return the path 

Dim filesystem As New FileSystemObject 

StripFilename = filesystem.GetParentFolderName(sPathFile) & "\" 

Exit Function 

End Function 
+2

Schlechte Idee, weil es einen Verweis auf Arbeit erfordert. Wenn Sie darauf bestehen, sollten Sie die späte Bindung verwenden. –

+9

Seit wann sind Referenzen eine schlechte Idee? Der Zugriff selbst erfordert Referenzen auf die Arbeit. 0_o –

+0

Das funktioniert gut in VBA. Ich musste nur Dateisystem zu einem regulären Objekt machen und dann auf den vollen Typ von FileSystemObject setzen. – MattCucco

1

links (currentdb.Name, Instr (1, currentdb.Name, dir (currentdb.Name)) - 1)

Dir Die Funktion wird nur die Datei Teil des vollständigen Pfad zurückzukehren. Currentdb.Name wird hier verwendet, aber es könnte eine vollständige Pfadzeichenfolge sein.

+0

Hmm, das klingt, als ob es nicht funktionieren würde, wenn der Dateiname Teil des Pfades wäre, zB. "c: \ was.txt \ x \ y \ z \ was.txt" würde falsch aufgeteilt werden. – apenwarr

+3

Korrigieren. Ich werde meine Antwort bearbeiten, sobald mir das passiert oder jemand, den ich kenne. Bisher hat es nicht. –

1

Wenn Sie nur den Pfad der derzeit in der Access-Benutzeroberfläche geöffneten MDB benötigen, würde ich vorschlagen, eine Funktion zu schreiben, die CurrentDB.Name analysiert und das Ergebnis anschließend in einer statischen Variablen in der Funktion speichert. So etwas wie das:

Public Function CurrentPath() As String 
    Dim strCurrentDBName As String 
    Static strPath As String 
    Dim i As Integer 

    If Len(strPath) = 0 Then 
    strCurrentDBName = CurrentDb.Name 
    For i = Len(strCurrentDBName) To 1 Step -1 
     If Mid(strCurrentDBName, i, 1) = "\" Then 
      strPath = Left(strCurrentDBName, i) 
      Exit For 
     End If 
    Next 
    End If 
    CurrentPath = strPath 
End Function 

Dies hat den Vorteil, dass es nur den Namen einmal durchläuft.

Natürlich funktioniert es nur mit der Datei, die in der Benutzeroberfläche geöffnet ist.

Ein anderer Weg, dies zu schreiben wäre, die Funktionen an den link innerhalb der Funktion oben so zu nutzen:

sehr effizient den Strompfades Abrufen
Public Function CurrentPath() As String 
    Static strPath As String 

    If Len(strPath) = 0 Then 
    strPath = FolderFromPath(CurrentDB.Name) 
    End If 
    CurrentPath = strPath 
End Function 

Dies macht während Code verwendet wird, die für die Suche verwendet werden kann, der Pfad für einen beliebigen Dateinamen/Pfad.

10

Dies scheint zu funktionieren. Das oben genannte gilt nicht in Excel 2010.

Function StripFilename(sPathFile As String) As String 
'given a full path and file, strip the filename off the end and return the path 
Dim filesystem As Object 

Set filesystem = CreateObject("Scripting.FilesystemObject") 

StripFilename = filesystem.GetParentFolderName(sPathFile) & "\" 

Exit Function 

End Function 
+0

Referenzen können auch in Excel VBA festgelegt werden. Klicken Sie im VBA-Editor auf das Menü Extras und dann auf Verweise. Aktivieren Sie das Kontrollkästchen in der Liste neben "Microsoft Scripting Runtime". Der FileSystemObject-Typ sollte dann verfügbar sein, um in der Dim-Anweisung zu deklarieren. –

+0

Dies ist im Grunde die gleiche Funktion von @Siddharth Rout, aber es funktioniert ohne einen Verweis auf die "Microsoft Scripting Runtime" -Bibliothek. – ChrisB

0

Versuchen Sie, diese Funktion:

Function FolderPath(FilePath As String) As String 

    '-------------------------------------------------- 
    'Returns the folder path form the file path. 

    'Written by: Christos Samaras 
    'Date:   06/11/2013 
    '-------------------------------------------------- 

    Dim FileName As String 

    With WorksheetFunction 
     FileName = Mid(FilePath, .Find("*", .Substitute(FilePath, "\", "*", Len(FilePath) - _ 
        Len(.Substitute(FilePath, "\", "")))) + 1, Len(FilePath)) 
    End With 

    FolderPath = Left(FilePath, Len(FilePath) - Len(FileName) - 1) 

End Function

Wenn Sie den letzten Backslash nicht entfernen? „\“ Am Ende des Pfads des Ordners, die letzte Zeile mit diesem ändern:

FolderPath = Left(FilePath, Len(FilePath) - Len(FileName))

Beispiel:

FolderPath("C:\Users\Christos\Desktop\LAT Analysers Signal Correction\1\TP 14_03_2013_5.csv") 

gibt:

C: \ Benutzer \ Christos \ Desktop \ LAT Analysatoren Signalkorrektur \ 1

oder

C: \ Benutzer \ Christos \ Desktop \ LAT Analysatoren Signalkorrektur \ 1 \

im zweiten Fall (beachten Sie, dass es am Ende einen Backslash gibt).

Ich hoffe es hilft ...

-1

Verwenden Sie diese Codes und genießen Sie es.

Public Function GetDirectoryName(ByVal source As String) As String() 
Dim fso, oFolder, oSubfolder, oFile, queue As Collection 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set queue = New Collection 

Dim source_file() As String 
Dim i As Integer   

queue.Add fso.GetFolder(source) 'obviously replace 

Do While queue.Count > 0 
    Set oFolder = queue(1) 
    queue.Remove 1 'dequeue 
    '...insert any folder processing code here... 
    For Each oSubfolder In oFolder.SubFolders 
     queue.Add oSubfolder 'enqueue 
    Next oSubfolder 
    For Each oFile In oFolder.Files 
     '...insert any file processing code here... 
     'Debug.Print oFile 
     i = i + 1 
     ReDim Preserve source_file(i) 
     source_file(i) = oFile 
    Next oFile 
Loop 
GetDirectoryName = source_file 
End Function 

Und hier können Sie rufen Funktion:

Sub test() 
Dim s 
For Each s In GetDirectoryName("C:\New folder") 
Debug.Print s 
Next 
End Sub 
26

Sie etwas Einfaches wie tun können: Left(path, InStrRev(path, "\"))

Beispiel:

Function GetDirectory(path) 
    GetDirectory = Left(path, InStrRev(path, "\")) 
End Function 
+0

Meister !! Beste Lösung bei weitem! –