vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Visual-Basic Einsteiger
Ordner, 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...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel