| |
Visual-Basic EinsteigerOrdner, Unterordner und Dateien in Klasse/n speichern | | | Autor: Chamaeleon | Datum: 14.01.17 11:10 |
| Hallo liebe Community!
Ich wende mich mit folgendem Problem an euch und erhoffe mir Hilfe.
Ich habe mir eine Applikation gebastelt die mir unter Einbezug eines Quellenpfades (Ordner) alle darin befindlichen Unterordner und Dateien ausliest und diese in einer Listbox als Vorschau darstellt, das klappt auch alles wunderbar. Zusätzlich möchte ich aber die gefundenen Unterordner und deren Dateien in einer Klasse/n speichern. Soweit ich weiß brauche ich auf jedenfall ein Collection für die Unterordner und quasi dazu ein Collection für die Dateien eines Unterordners. Die Klasse/n soll/en die Struktur eines 2D-Array haben, jedenfalls stelle ich mir das so vor. Ansprechen möchte ich das dann wie folgt:
objOrdner.Name/Pfad 'Quellenordner Pfad bzw. Name
objOrdner.Unterordner(1).Name/Pfad 'Unterordner Pfad bzw. Name
objOrdner.Unterordner(1).Datei(1).Name/Pfad 'Vom ersten Unterordner der ersten Datei den Namen bzw. Pfad
objOrdner.Unterordner(1).Datei.Anzahl 'Gibt Anzahl der Dateien aus dem ersten Unterordner wieder
Mein Problem ist, nicht zu wissen wie es zu realisieren ist. Muss ich mit Collection in Collection abreiten und wie sieht die Vererbung aus? Hier mein bisheriger Code:
'clsUnterordner
Private m_objUnterordner As clsDetails
private m_strOrdername as string
private m_strOrdnerpfad as string
Private Sub Class_Initialize()
Set m_objUnterordner = New clsDetails
End Sub
Private Sub Class_Terminate()
Set m_objUnterordner = Nothing
End Sub
Public Property Get Unterordner(vntIndex As Variant) As clsDetails
Set Unterordner = m_objUnterordner(vntIndex)
End Property
Public Property Get Anzahl() As Long
Anzahl = m_objUnterordner.Count
End Property
Public Property Get Ordnerpfad() As string
Ordnerpfad = m_strOrdnerpfad
End Property
Public Property Get Ordnername() As string
Ordnername = m_strOrdnername
End Property
Public Property Let Ordnerpfad(strOrdnerpfad As String)
m_strOrdnerpfad = strOrdnerpfad
End Property
Public Property Let Ordnername(strOrdnername As String)
m_strOrdnername = strOrdnername
End Property
Public Function UnterordnerHinzufügen(strUnterordnername As String, _
strUnterordnerpfad As _
String)
Dim objDatei As clsDetails
If Exists(strUnterordnername & strUnterordnerpfad) Then
MsgBox "Dieser Eintrag existiert bereits"
Else
Set objUnterordner = New clsDetails
objUnterordner.Name = strUnterordnername
objUnterordner.Pfad = strUnterordnerpfad
m_objUnterordner.Add objUnterordner, strUnterordnername & _
strUnterordnerpfad
End If
End Function
Public Function Exists(vntIndex As Variant) As Boolean
On Error Resume Next
Exists = Not CBool(m_objUnterordner(vntIndex) Is Nothing)
End Function
Public Sub Remove(vntIndex As Variant)
m_objUnterordner.Remove vntIndex
End Sub
'clsDetails
Private m_strName As String
Private m_strPfad As String
Public Property Get Name() As String
Name = m_strName
End Property
Public Property Get Pfad() As String
Pfad = m_strPfad
End Property
Public Property Let Name(strName As String)
m_strName = strName
End Property
Public Property Let Pfad(strPfad As String)
m_strPfad = strPfad
End Property Ich hoffe mir kann jemand mit meinem Problem weiter Helfen... | |
Re: Ordner, Unterordner und Dateien in Klasse/n speichern | | | Autor: Blackbox | Datum: 14.01.17 11:52 |
| Hi,
Das was Du bauen willst, gibt es schon fix und fertig von Microsoft: Shell.Application.
Einen Verweis auf Microsoft Shell Controls And Automation setzen und dann das objekt so erzeugen:
Dim oSh As Shell.Appllication
Set oSh = CreateObject("Shell.Application")
Vorher sich noch durch das Shell Objektmodell googeln. Sich die Eigenschaften und Methoden von Folder, Folders, Namespace etc. etwas aneignen. Auch die schöne schnuckelige BrowseForFolder-Methode. etc. | |
Re: Ordner, Unterordner und Dateien in Klasse/n speichern | | | Autor: Chamaeleon | Datum: 14.01.17 14:16 |
| Hallo Blackbox, vielen Dank für deine Antwort!
Ich kenne das Scripting.FileSytemObject genauso wie die Shell.Applikation. Über FSO lasse ich bereits das Verzeichnis einlesen und in einer Vorschau anzeigen mit der Shell. Applikation hole ich mir detaillierte Informationen der Datei. Für meine Vorschau habe ich zusätzlich einen Unterordner bzw. Dateifilter den ich auf meine Vorschau anwenden kann. Beim Filtern möchte ich aber nicht immer wieder auf das System zu greifen, sondern nur einmalig beim befüllen der Listbox. Und danach ebend über eine Klasse filtern. ...Klar geht locker mit nem Array, dachte mir nur, je nach dem wie sich mein Tool entwickelt. könnte ich mit einer Klasse immer wieder darauf bequem zurückgreifen. Zudem ist der Server auf dem ich das Anwenden möchte etwas langsam...
Soweit mein Hintergrund. Von der Performance bin ich überfragt was besser ist Klasse vs. Array vermutlich Array, wobei sich die Frage stellt ob das einen erheblichen Unterschied z.B.
bei 8000 Files macht und ich mit einem Array doch besser beraten wäre.
Gruß Marco | |
Re: Ordner, Unterordner und Dateien in Klasse/n speichern | | | Autor: Manfred X | Datum: 15.01.17 09:40 |
| Hallo!
Eine relativ einfache Vorgehensweise wäre es,
wenn Du in eine Klasse "FilesystemEntry" erstellst,
die alle benötigten Angaben zu einem Ordner/ einer Datei
enthält (Name, Größe, Erstelldatum, Kommentar usw.)
Es wird ein Array erstellt, dessen Elemente Instanzen dieser Klasse
sind (ein Element pro Unterordner bzw. Datei).
Zusätzlich wäre dieser FileSystemEntry-Klasse eine Integer-Eigenschaft
hinzufügen, in der beim Füllen der Array-Index des übergeordneten
FilesystemEntries einzutragen ist, d.h. bei Dateien der Index des
Unterordners, zu dem sie gehören; bei Unterordnern der Index des
jeweils übergeordneten Ordners.
So ein Array kann innerhalb einer Klasse gekapselt werden.
Diese Klasse könnte Methoden enthalten, die z.B. alle Unterordner eines
Ordners oder alle Namen der Dateien eines Unterordners auflisten.
(Durchlauf des gekapselten Array und Zusammenstellung/Filterung anhand
der oben genannten Integer-Eigenschaft der Arrayelemente.)
Beitrag wurde zuletzt am 15.01.17 um 09:43:48 editiert. | |
Re: Ordner, Unterordner und Dateien in Klasse/n speichern | | | Autor: Chamaeleon | Datum: 15.01.17 19:06 |
| Hallo Manfred X,
vielen Dank für deine Idee. Für mich klingt es genau nach dem was ich haben möchte. Da ich, wie bereits erwähnt mich das erst mal mit Klassen auseinander setzte, könntest du mir vielleicht ein kleines Bsp. zu kommen lassen? Wäre jedenfalls sehr nett und hilfreich von dir.
Gruß Marco | |
Re: Ordner, Unterordner und Dateien in Klasse/n speichern | | | Autor: Chamaeleon | Datum: 15.01.17 19:14 |
| Hier nochmal mein Ansatz (auch zu finden bei Herbers Excel Forum, dort allerdings auch ohne Erfolg bisher, Hust xD).
Ich habe mir eine Applikation gebastelt die mir unter Einbezug eines Quellenpfades (Ordner) alle darin befindlichen Unterordner und Dateien ausliest und diese in einer Listbox als Vorschau darstellt, das klappt auch alles wunderbar. Zusätzlich möchte ich aber die gefundenen Unterordner und deren Dateien in einer Klasse/n speichern. Soweit ich weiß brauche ich auf jedenfall ein Collection für die Unterordner und quasi dazu ein Collection für die Dateien eines Unterordners. Die Klasse/n soll/en die Struktur eines 2D-Array haben, jedenfalls stelle ich mir das so vor. Ansprechen möchte ich das dann wie folgt:
objOrdner.Name/Pfad 'Quellenordner Pfad bzw. Name
objOrdner.Unterordner(1).Name/Pfad 'Unterordner Pfad bzw. Name
objOrdner.Unterordner(1).Datei(1).Name/Pfad 'Vom ersten Unterordner der ersten Datei den Namen bzw. Pfad
objOrdner.Unterordner(1).Datei.Anzahl 'Gibt Anzahl der Dateien aus dem ersten Unterordner wieder.
Mit FSO hole ich mir bereits Dateien und lasse sie mir in einer Listbox anzeigen. Mit der Shell hole ich mir Detailierte Informationen. Was ich möchte, ist in der Listboc nach Ordner/Dateien zu filtern und ggf. direkt beim einlesen Daten zu manipulieren. Daher halte ich eine Klasse/n für sinnvoll.
Aktuell kann ich Unterordner und Dateien hinzufügen, nur haben die keine Zusammengehörigkeit, die ich aber möchte. Hier mein bisheriger Code:
'clsUnterordner
Option Explicit
Private m_objUnterordner As Collection
Private Sub Class_Initialize()
Set m_objUnterordner = New Collection
End Sub
Private Sub Class_Terminate()
Set m_objUnterordner = Nothing
End Sub
Public Property Get UnterordnerIndex(vntIndex As Variant) As clsEigenschaften
Set UnterordnerIndex = m_objUnterordner(vntIndex)
End Property
Public Property Get Unterordner() As Collection
Set Unterordner = m_objUnterordner
End Property
Public Property Get UnterordnerAnzahl() As Long
UnterordnerAnzahl = m_objUnterordner.Count
End Property
Public Function UnterordnerHinzufügen(strPfad As String, strName As String)
Dim objUnterordner As clsEigenschaften
If Exists(strPfad & strName) Then
MsgBox "Dieser Eintrag existiert bereits"
Else
Set objUnterordner = New clsEigenschaften
objUnterordner.Pfad = strPfad
objUnterordner.Name = strName
m_objUnterordner.Add objUnterordner, strPfad & strName
End If
End Function
Public Function Exists(vntIndex As Variant) As Boolean
On Error Resume Next
Exists = Not CBool(m_objUnterordner(vntIndex) Is Nothing)
End Function
Public Sub Remove(vntIndex As Variant)
m_objUnterordner.Remove vntIndex
End Sub 'clsDatei
Option Explicit
Private m_objDatei As Collection
Private Sub Class_Initialize()
Set m_objDatei = New Collection
End Sub
Private Sub Class_Terminate()
Set m_objDatei = Nothing
End Sub
Public Property Get DateiIndex(vntIndex As Variant) As clsEigenschaften
Set DateiIndex = m_objDatei(vntIndex)
End Property
Public Property Get Datei() As Collection
Set Datei = m_objDatei
End Property
Public Property Get DateiAnzahl() As Long
DateiAnzahl = m_objDatei.Count
End Property
Public Function DateiHinzufügen(strPfad As String, strName As String)
Dim objDatei As clsEigenschaften
If Exists(strPfad & strName) Then
MsgBox "Dieser Eintrag existiert bereits"
Else
Set objDatei = New clsEigenschaften
objDatei.Pfad = strPfad
objDatei.Name = strName
m_objDatei.Add objDatei, strPfad & strName
End If
End Function
Public Function Exists(vntIndex As Variant) As Boolean
On Error Resume Next
Exists = Not CBool(m_objDatei(vntIndex) Is Nothing)
End Function
Public Sub Remove(vntIndex As Variant)
m_objDatei.Remove vntIndex
End Sub 'clsEigenschaften
Option Explicit
Private m_strName As String
Private m_strPfad As String
Public Property Get Name() As Date
Name = m_strName
End Property
Public Property Get Pfad() As String
Pfad = m_strPfad
End Property
Public Property Let Name(strName As String)
m_strName = strName
End Property
Public Property Let Pfad(strPfad As String)
m_strPfad = strPfad
End Property | |
Kleine Spielerei ... | | | Autor: Manfred X | Datum: 17.01.17 08:35 |
| In der FileList-Klasse werden Dateien (Angabe im Parameter mit vollem Pfad)
angehängt. Ordnerangaben und Zeiger werden dabei automatisch erstellt.
Abfragen von Ordner- oder Dateilisten durch die GetEntries-Methode.
'FilesystemEntry-Klasse
Option Explicit
Public name As String 'eines Unterordners oder einer Datei
Public IsFile As Boolean 'Ist es eine Datei?
Public Parent As Integer 'direkt übergeordneter Ordner (Arrayindex) =============================
'FileList-Klasse
Option Explicit
Private Entries() As FilesystemEntry
Public Count As Integer
Private Sub Class_Initialize()
ReDim Entries(1 To 1000) As FilesystemEntry
Count = 0
End Sub
Private Sub Class_terminate()
Count = 0
ReDim Entries(0) As FilesystemEntry
End Sub
Public Function AddFilePath(Filepath As String) As Boolean
'Eintragung einer Datei (kompletter Pfad)
AddFilePath = False
Dim parts() As String, i%, index%
'Pfad in Teile zerlegen
parts = Split(Filepath, "\", , vbTextCompare)
If UBound(parts) < 2 Then Exit Function
'fehlende Einträge in der Entry-Liste ergänzen
Dim path As String, oldindex%
oldindex = -1
For i = 0 To UBound(parts)
path = path & parts(i) & "\"
If Not i = UBound(parts) Then
'Ist der Eintrag des Teilpfades bereits vorhanden
index = FindEntryByPath(path, False)
End If
If i = UBound(parts) Or index < 1 Then
'Datei oder neuer Pfadteil wird ergänzt
Count = Count + 1
If Count >= UBound(Entries) Then
'Array ggf. verlängern
ReDim Preserve Entries(1 To UBound(Entries) + 1000)
End If
'neuer Eintrag
Set Entries(Count) = New FilesystemEntry
Entries(Count).name = Trim(UCase(parts(i)))
Entries(Count).Parent = oldindex 'übergeordn. Entry
If i = UBound(parts) Then Entries(Count).IsFile = True
index = Count
End If
oldindex = index
Next i
AddFilePath = True
End Function
Private Function FindEntryByPath(ByVal path As String, _
Optional ByVal GetFiles As Boolean = True) As Integer
'Listen-Index einer Datei oder eines Ordners ermitteln
Dim i%
path = Trim(UCase(path))
For i = 1 To Count
If Entries(i).IsFile = GetFiles Then
If path = GetPath(i) Then
FindEntryByPath = i
Exit Function
End If
End If
Next i
FindEntryByPath = -1
End Function
Private Function GetPath(ByVal index As Integer) As String
'Zu einem Arrayindex den kompletten Pfad zusammenstellen
GetPath = ""
If index < 1 Or index > Count Then Exit Function
Dim path$, i%
i = index: path = ""
Do
path = Entries(i).name & "\" & path
i = Entries(i).Parent
Loop While i > 0
GetPath = path
End Function
Public Sub GetEntries(FolderPath As String, ByRef FolderEntries$(), _
Optional ByVal GetFiles As Boolean = True, _
Optional ByVal GetFullPath As Boolean = True)
'Alle Dateinamen (GetFiles=True) oder alle Unterordner (false)
'im FolderPath zurückgeben (Angabe mit \ abschließen)
Dim index%, i%, c%, ok As Boolean
index = FindEntryByPath(FolderPath, False)
If index < 1 Then
ReDim FolderEntries(0)
FolderEntries(0) = "Ordner nicht gefunden"
Exit Sub
End If
ReDim FolderEntries(10)
For i = 1 To Count
If Entries(i).IsFile = GetFiles And Entries(i).Parent = index Then
c = c + 1
If UBound(FolderEntries) = c Then
ReDim Preserve FolderEntries(c + 10)
End If
If Not GetFullPath Then
FolderEntries(c) = Entries(i).name
Else
FolderEntries(c) = GetPath(i)
FolderEntries(c) = _
Mid$(FolderEntries(c), 1, Len(FolderEntries(c)) - 1)
End If
End If
Next i
ReDim Preserve FolderEntries(c)
End Sub
Beitrag wurde zuletzt am 17.01.17 um 08:41:04 editiert. | |
Re: Kleine Spielerei ... | | | Autor: Chamaeleon | Datum: 20.01.17 19:41 |
| Hallo Manfred, sry erst jetzt dazu gekommen. Vielen Dank für deine Mühe.
Anhand des Bsp. werde ich mit aufjedenfall etwas basteln können.
Gruß Marco | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevDTA 3.0 Pro
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|