vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 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

VB.NET - Ein- und Umsteiger
Re: Zuletzt geänderte Datei herausfinden 
Autor: 00tommy
Datum: 18.07.17 20:36

Nochmal ich,

wie kann ich mehrere Verzeichnisse zum durchsuchen angeben.

Habe mir eine zweite Form für die Pfade angelegt. Die ich in my.settings speichere
My.Settings.Pfad1 = TextBox1.Text
        My.Settings.Save()
        My.Settings.Reload()
        My.Settings.Pfad2 = TextBox2.Text
        My.Settings.Save()
        My.Settings.Reload()
Das ganze aneinanderreihen brachte nur, das immer er letzte Pfad angezeigt wird.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Zuletzt geänderte Datei herausfinden 
Autor: TheExOne
Datum: 26.11.07 23:01

Hallo.
Ich kriege es einfahc nicht nicht.
Wie kann ich es bewerkstelligen, dass ich die zuletzt geänderte Datei aus einem Ordner bekomme?

MfG Chris
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: GPM
Datum: 27.11.07 01:19

Probiere das mal:
Dim dt As DateTime, fname As String = String.Empty
     For Each fi As String In IO.Directory.GetFiles("Pfad")
            If IO.File.GetLastWriteTime(fi) > dt Then
                dt = IO.File.GetLastWriteTime(fi)
                fname = IO.Path.GetFileName(fi)
            End If
     Next
Me.Text = dt & " , " & fname
MfG GPM
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: TheExOne
Datum: 27.11.07 13:38

Thx, funkt 1a.

MfG Chris
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: 00tommy
Datum: 11.07.17 21:02

Hallo,

wie kann ich in die Suche alle Unterordner miteinbeziehen ?

MfG
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: Manfred X
Datum: 12.07.17 09:42

Hallo!

Schau Dir mal die Überladungen der "GetFiles"-Methode an.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: 00tommy
Datum: 13.07.17 21:32

Hi,

hat noch jemand einen Tipp, bzw ein Beispiel ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: Franki
Datum: 14.07.17 02:22

Hallo,

was passt denn bei dem Hinweis von Manfred X nicht?

Wenn du es mit Schleifen machen möchtest, dann schau mal hier:

http://www.vbarchiv.net/tipps/tipp_1506-dateien-eines-ordners-inkl-unterordner-rekursiv-ermitteln.html

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Liste Fileinformationen, Threading, Invoke .... 
Autor: Manfred X
Datum: 14.07.17 08:52

Beispiel zum Erstellen einer Liste
Public Class FileSystemStuff
 
    Public Class FilesystemStuffArgs
        Inherits EventArgs
        Private _count As Integer = 0
 
        Friend Sub New(Count As Integer)
            _count = Count
        End Sub
 
        ''' <summary>Anzahl gelisteter Dateien</summary>
        Public ReadOnly Property Count() As Integer
            Get
                Return _count
            End Get
        End Property
    End Class
 
 
    Public Class FileInformation
        ''' <summary>Name und Extensions der Datei</summary>
        Public ReadOnly name As String
        '''<summary>Name des Ordners/Unterordners</summary>
        Public ReadOnly folder As String
        Public ReadOnly fullpath As String
        Public ReadOnly length As Long
        Public ReadOnly LastWriteTime As Date
        Public ReadOnly IsReadonly As Boolean
 
 
        Friend Sub New(fi As IO.FileInfo)
 
            With fi
                name = .Name
                fullpath = .FullName
                folder = IO.Path.GetFileName(.DirectoryName)
                length = .Length
                LastWriteTime = .LastWriteTime
                IsReadonly = .IsReadOnly
            End With
        End Sub
 
    End Class
 
 
    Public FileInformationArray() As FileInformation
 
    Public Event Progress(ByVal sender As Object, e As FilesystemStuffArgs)
    Public Event Finished(ByVal sender As Object, e As FilesystemStuffArgs)
 
 
    ''' <summary>Abfrage der Angaben zu den Dateien in einem Ordner</summary>
    ''' <param name="folder">Ordner</param>
    ''' <param name="so">Unterordner einbeziehen?</param>
    Public Sub CreateFolderFileInfos(ByVal folder As String, _
        Optional so As IO.SearchOption = IO.SearchOption.TopDirectoryOnly)
 
        FileInformationArray = Nothing
 
        If Not IO.Directory.Exists(folder) Then Exit Sub
 
        Dim filelist As New List(Of FileInformation)(200)
        Dim c As Integer = 0
        For Each file As String In IO.Directory.EnumerateFiles(folder, "*.*", _
          so)
            If c Mod 10 = 0 Then
                RaiseEvent Progress(Me, New FilesystemStuffArgs(c))
            End If
            Dim fi As New IO.FileInfo(file)
            filelist.Add(New FileInformation(fi))
            c += 1
        Next file
        FileInformationArray = filelist.ToArray
        RaiseEvent Finished(Me, New FilesystemStuffArgs(c))
    End Sub
 
End Class
Anwendung
Public Class Form1
 
    Private WithEvents FileStuff As New FileSystemStuff
 
    Dim WithEvents btnStart As New Button With _
    {.Parent = Me, .Width = 300, .Text = "Dateien listen"}
 
    Private lblinfo As New Label With _
        {.Parent = Me, .Size = New Size(300, 100), .Top = 50, _
         .AutoSize = False}
 
    Dim infotext As String = ""
 
    Private lboFiles As New ListBox With _
        {.Parent = Me, .Top = 170, .Size = New Size(300, 200), _
         .HorizontalScrollbar = True}
 
 
    Private Sub Form1_Load(sender As System.Object, _
         e As System.EventArgs) Handles MyBase.Load
        Me.Size = New Size(320, 480)
    End Sub
 
 
    Private Sub FileStuff_Progress(sender As Object, _
        e As FileSystemStuff.FilesystemStuffArgs) _
        Handles FileStuff.Progress
 
        infotext = _
        "Dateien werden gelistet" & vbCrLf & "Ermittelt: " & e.Count.ToString
 
        If lblinfo.InvokeRequired Then
            lblinfo.Invoke(New MethodInvoker(AddressOf SetInfoText))
        Else
            SetInfoText()
        End If
 
    End Sub
 
 
    Private Sub FileStuff_Finished(sender As Object, _
            e As FileSystemStuff.FilesystemStuffArgs) _
            Handles FileStuff.Finished
 
        infotext = _
          "Dateien sind gelistet worden " & vbCrLf & _
          "Gesamtzahl: " & e.Count.ToString
 
        lblinfo.Invoke(New MethodInvoker(AddressOf SetInfoText))
        lboFiles.Invoke(New MethodInvoker(AddressOf SetFileList))
    End Sub
 
 
    Private Sub SetInfoText()
        lblinfo.Text = infotext
    End Sub
 
 
    Private Sub SetFileList()
        lboFiles.Items.Clear()
        For Each it As FileSystemStuff.FileInformation _
            In FileStuff.FileInformationArray
 
            lboFiles.Items.Add _
            (it.name & vbTab & " (" & it.folder & ")  " & vbTab & _
             it.LastWriteTime.ToString)
        Next it
    End Sub
 
 
    Private Sub btnStart_Click(sender As Object, _
        e As System.EventArgs) Handles btnStart.Click
 
        Dim th As New Threading.Thread _
        (New Threading.ThreadStart(AddressOf CreateFileList))
        th.Start()
    End Sub
 
 
    Private Sub CreateFileList()
        'Ordner
        Dim myfolder As String = "C:\Daten"
        FileStuff.CreateFolderFileInfos _
           (myfolder, IO.SearchOption.AllDirectories)
    End Sub
 
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Liste Fileinformationen, Threading, Invoke .... 
Autor: 00tommy
Datum: 15.07.17 17:38

Moin,

meine Anwendung sieht jetzt so aus:
Public Class Form1
 
    Private WithEvents FileStuff As New FileSystemStuff
 
    Dim infotext As String = ""
 
    Private Sub FileStuff_Progress(sender As Object, e As _
      FileSystemStuff.FilesystemStuffArgs) Handles FileStuff.Progress
 
        infotext = "Dateien werden gelistet" & vbCrLf & "Ermittelt: " & _
          e.Count.ToString
 
        If lblinfo.InvokeRequired Then
            lblinfo.Invoke(New MethodInvoker(AddressOf SetInfoText))
        Else
            SetInfoText()
        End If
 
    End Sub
 
    Private Sub FileStuff_Finished(sender As Object, e As _
      FileSystemStuff.FilesystemStuffArgs) Handles FileStuff.Finished
 
        infotext = _
          "Dateien sind gelistet worden " & vbCrLf & _
          "Gesamtzahl: " & e.Count.ToString
 
        lblinfo.Invoke(New MethodInvoker(AddressOf SetInfoText))
        lboFiles1.Invoke(New MethodInvoker(AddressOf SetFileList))
    End Sub
 
 
    Private Sub SetInfoText()
        lblinfo.Text = infotext
    End Sub
 
 
    Private Sub SetFileList()
        lboFiles1.Items.Clear()
        For Each it As FileSystemStuff.FileInformation In _
          FileStuff.FileInformationArray
 
            lboFiles1.Items.Add(it.LastWriteTime.ToString("yyyy.MM.dd" & _
              "HH:mm:ss") & vbTab & it.fullpath)
        Next it
    End Sub
 
 
    Private Sub CreateFileList()
        'Ordner
        Dim myfolder As String = TextBox1.Text
        FileStuff.CreateFolderFileInfos(myfolder, _
          IO.SearchOption.AllDirectories)
    End Sub
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
      Button1.Click
        If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then
            TextBox1.Text = FolderBrowserDialog1.SelectedPath
        End If
        Dim th As New Threading.Thread(New Threading.ThreadStart(AddressOf _
          CreateFileList))
        th.Start()
 
    End Sub
 
End Class
Aber wie kann man die Listbox noch automatisch sortieren, das daß aktuellste Datum ganz oben ist ?

Tschö
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Liste Fileinformationen, Threading, Invoke .... 
Autor: Manfred X
Datum: 16.07.17 14:43

Die Liste mit den FileInfos befindet sich im Array "FileInformationArray".
Die Array-Klasse bietet die "Sort"-Methode zum Sortieren der Elemente, wobei u.a.
auf die "IComparable"-Schnittstelle der Array-Elemente zurückgegriffen werden kann.

Im Beispiel sind die Array-Elemente Instanzen der FileInformation-Klasse.
Diese Klasse benötigt deshalb eine Implementierung der Schnittstelle.
Sie sieht dann z.B. so aus:
Public Class FileInformation
    Implements IComparable(Of FileInformation)
 
    ''' <summary>Name und Extensions der Datei</summary>
    Public ReadOnly name As String
    '''<summary>Name des Ordners/Unterordners, in dem sich die Datei 
    ' befindet</summary>
    Public ReadOnly folder As String
    ''' <summary>Laufwerk, Pfad und Name der Datei</summary>
    Public ReadOnly fullpath As String
    ''' <summary>Länge der Datei in Bytes</summary>
    Public ReadOnly length As Long
    ''' <summary>Datum der letzten Änderung</summary>
    Public ReadOnly LastWriteTime As Date
    ''' <summary>Schreibschutz gesetzt?</summary>
    Public ReadOnly IsReadonly As Boolean
 
 
    Friend Sub New(fi As IO.FileInfo)
 
       With fi
          name = .Name
          fullpath = .FullName
          folder = IO.Path.GetFileName(.DirectoryName)
          length = .Length
          LastWriteTime = .LastWriteTime
          IsReadonly = .IsReadOnly
       End With
    End Sub
 
 
    Public Function DateTime_CompareTo(other As FileInformation) As Integer _
        Implements System.IComparable(Of FileInformation).CompareTo
 
        Dim diff As Long = Me.LastWriteTime.Ticks - other.LastWriteTime.Ticks
        If Math.Abs(diff) < TimeSpan.TicksPerMinute Then
           Return 0 'Differenz kleiner 1 Sekunde gilt als gleichzeitig !!!
        ElseIf diff >= TimeSpan.TicksPerSecond Then
           Return 1
        Else
           Return -1
        End If
 
        End Function
 End Class
Um das Sortieren des "FileInformationArray" gemäß dem "LastWriteTime"-Member komfortabel
durchführen zu können, wird in der Klasse "FilesystemStuff" eine entsprechende Methode
ergänzt:
Public Sub SortDateTime(ByVal sortorder As SortOrder)
 
    Array.Sort(FileInformationArray)
 
    If sortorder = Windows.Forms.SortOrder.Descending Then
       Array.Reverse(FileInformationArray)
    End If
End Sub
Im Formular (Methode: SetFileList) kann das gefüllte Array sortiert werden.
Damit das Resultat besser aussieht, wird die Listbox "lboFiles"
durch ein Listview-Control ersetzt.
Dim lvwFileInformation As New ListView With _
   {.Parent = Me, .Top = 170, .Size = New Size(300, 200)}
 
Private Sub SetFileList()
 
   With lvwFileInformation
      'Listview vorbereiten
      .Items.Clear()
      .Columns.Clear()
      .View = View.Details
      .Columns.Add("Name", 100)
      .Columns.Add("LastWriteTime", 150)
      .Columns.Add("Folder", 150)
 
      'Sortieren des Array
      FileStuff.SortDateTime(SortOrder.Descending)
 
      'Array-Daten in ListviewItems eintragen
      For i As Integer = 0 To FileStuff.FileInformationArray.Length - 1
         Dim it As FileSystemStuff.FileInformation = _
                FileStuff.FileInformationArray(i)
         Dim lvi As ListViewItem = .Items.Add(it.name)
         lvi.SubItems.Add(it.LastWriteTime.ToString)
         lvi.SubItems.Add(it.folder)
      Next i
   End With
 
End Sub
Das ausgetauschte Control erfordert eine weitere Anpassung beim Invoke:
Private Sub FileStuff_Finished(sender As Object, _
            e As FileSystemStuff.FilesystemStuffArgs) Handles FileStuff.Finished
    infotext = _
       "Dateien sind gelistet worden " & vbCrLf & "Gesamtzahl: " & _
       e.Count.ToString
 
    lblinfo.Invoke(New MethodInvoker(AddressOf SetInfoText))
    lvwFileInformation.Invoke(New MethodInvoker(AddressOf SetFileList))
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Liste Fileinformationen, Threading, Invoke .... 
Autor: 00tommy
Datum: 16.07.17 20:19

Danke Manfred,

läuft super. Macht genau das was es soll.
Mir ist nur aufgefallen, wenn ich den Windows Ordner auflisten möchte, bekomme ich folgende Meldung:

Ein Ausnahmefehler des Typs "System.UnauthorizedAccessException" ist in mscorlib.dll aufgetreten.

Dafür hat das Programm wohl keine Rechte.

Stört mich zwar nicht, aber bin neugierig wie man das abstellen kann.

Schönen Abend noch
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Liste Fileinformationen, Threading, Invoke .... 
Autor: effeff
Datum: 16.07.17 22:19

Starte das Programm ganz einfach mit einem Rechtsklick und "Ausführen als Administrator"...

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Liste Fileinformationen, Threading, Invoke .... 
Autor: 00tommy
Datum: 17.07.17 06:58

Hallo,

"Ausführen als Administrator" führt leider auch zum Absturz

Mit folgenden Code lösche ich eine ausgewählte Zeile.
Private Sub ListView1_KeyDown(ByVal sender As System.Object, ByVal e As _
  System.Windows.Forms.KeyEventArgs) Handles ListView1.KeyDown
        If e.KeyCode = 8 Or e.KeyCode = 46 Then
            For i As Long = ListView1.SelectedIndices.Count - 1 To 0 Step -1
                ListView1.Items.RemoveAt(ListView1.SelectedIndices(i))
            Next
 
        End If
 
    End Sub
Wie kann ich der Zeile dann wieder den Focus geben das sie farbig hinterlegt ist ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Liste Fileinformationen, Threading, Invoke .... 
Autor: Manfred X
Datum: 17.07.17 10:18

Du löscht mit diesem Code nicht unbedingt eine, sondern eventuell
mehrere markierte Zeilen im Listview - abhängig von der
Einstellung der "Multiselect"-Eigenschaft. (Die entsprechenden Dateien
werden dadurch im Dateisystem nicht gelöscht.)

Einer gelöschten Zeile kannst Du keinen Focus geben !?

Ich rate mal!
Du hast Multiselect auf false gesetzt und möchtest nach dem
Löschen des markierten Items den Focus auf den Index dieses
Items setzen (an dem jetzt das vorgerückte Item steht).
Das geht im "KeyDown"-Eventhandler etwa so ...
 With ListView1
    If .SelectedIndices.Count = 1 Then
       Dim index As Integer = .SelectedIndices(0)
       .Items.RemoveAt(index)
       index = Math.Min(index, .Items.Count - 1)
       if index >=0 then .Items(index).Selected = True
    End If
 End With
Übrigens: Wieso verwendest Du u.a. die "Back"-Taste (Code 8) zum Löschen ?
Nutze "Option Strict On": Die Laufvariable "i" sollte vom Typ Integer sein.
Schau Dir auch mal den "With ... End With"-Block an.

Beitrag wurde zuletzt am 17.07.17 um 10:48:28 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: 00tommy
Datum: 17.07.17 11:43

Hallo,

ich verwende die "Back" Taste gerne zum löschen, weil mein kleiner Finger seit einen Unfall etwas kürzer ist.
Komme da einfach besser hin.
Super das du immer verstehst wie es gemeint ist. (an dem jetzt das vorgerückte Item steht)
Wusste leider nicht wie ich es anders beschreiben sollte.

Das ganze läuft in einen Timer, und soll nach XX Sekunden überprüfen ob neue Dateien hinzugekommen sind.
Diese Linie sollte dann farbig markiert werden.

Manfred, ganz ehrlich. Vielen Vielen Dank für deine Hilfe. Ich hoffe du kannst mir nochmal helfen.
Würde das mal im Forum gut finden, wenn man die Mitglieder belohnen könnte. Im SPS Forum ist das gang und gebe.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: Manfred X
Datum: 17.07.17 13:27

Falls ich Dich richtig verstehe, willst Du zunächst eine Liste der
Dateien im Ordner erstellen und danach überwachen, ob neue Dateien
im Ordner "auftauchen" (durch Erstellen, Verschieben, Kopieren).

Dazu benutzt man einen FileSystemWatcher.
Dieses Control kann einen Ordner überwachen (Hintergrundprozeß)
und gezielt bestimmte Änderungen als Ereignis melden.

Deklaration des Watchers:
Private WithEvents fsw As New IO.FileSystemWatcher With_
    {.EnableRaisingEvents = False}
In der Routine "FileStuff_Finished" wird der Watcher nach Erstellen
der Dateiliste eingerichtet und aktiviert:
 Private Sub FileStuff_Finished(sender As Object, _
            e As FileSystemStuff.FilesystemStuffArgs) Handles FileStuff.Finished
 
        infotext = _
          "Dateien sind gelistet worden " & vbCrLf & "Gesamtzahl: " & _
          e.Count.ToString
 
        lblinfo.Invoke(New MethodInvoker(AddressOf SetInfoText))
        lvwFileInformation.Invoke(New MethodInvoker(AddressOf SetFileList))
 
        If FileStuff.FileInformationArray.Length > 0 Then
            With fsw
                'zu überwachende Dateien (Muster) 
                .Filter = "*.*"
                'zu überwachender Ordner 
                .Path = _
                IO.Path.GetDirectoryName _
                  (FileStuff.FileInformationArray(0).fullpath)
 
                .IncludeSubdirectories = True
                'Aktivierung des Watchers 
                .EnableRaisingEvents = True
            End With
        Else
            'Keine Dateien gelistet - Watcher????
            fsw.EnableRaisingEvents = False
        End If
    End Sub
Die Routinen zur Verarbeitung der Watcher-Meldungen für neu
hinzugekommene Dateien im Ordner:
Private FullPathToList As String
 
Private Sub fsw_Created(sender As Object, _
        e As System.IO.FileSystemEventArgs) Handles fsw.Created
 
        'Die Überwachung läuft im Hintergrund (InvokeRequired)
        FullPathToList = e.FullPath 'neue Datei
        lvwFileInformation.Invoke _
         (New MethodInvoker(AddressOf AddListItem))
End Sub
 
 
Public Sub AddListItem()
 
   If Not IO.File.Exists(FullPathToList) Then Exit Sub
   Dim fi As New IO.FileInfo(FullPathToList)
 
   With ListView1
      'Item mit Dateiangaben füllen
      Dim lvi As ListViewItem = .Items.Add(fi.Name)
      lvi.SubItems.Add(IO.Path.GetFileName(fi.DirectoryName))
      lvi.SubItems.Add(fi.LastWriteTime.ToString)
      'neues Item farbig markieren
      lvi.BackColor = Color.LightCyan
    End With
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: 00tommy
Datum: 17.07.17 14:47

Hallo,

ich sehe das
lvi.BackColor = Color.LightCyan
Leider habe ich noch nen Fehler drin, den ich nicht entdecke.
Hier nochmal das ganze

http://textuploader.com/dkw12
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: Manfred X
Datum: 17.07.17 18:54

Ich habe den Code grob durchgeschaut.
Die Fileliste muß anfangs nur einmal erstellt werden, also nicht in einem Timer.
Der aktivierte FileSystemwatcher meldet sich, sobald danach eine weitere Datei
im Ordner erzeugt oder eingefügt wird. Im Hintergrund läuft ein Überwachungsprozeß.
Der Timer ist deshalb nicht erforderlich.
Die Angaben zu einer neuen Datei werden im Listview als Item hinten angehängt.
Man kann auch das neue Item mit der Insert-Methode des Listview an einem passendem
Index einfügen (z.B. 0).
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: 00tommy
Datum: 17.07.17 21:08

Hallo,

jetzt geht es, obwohl ich nichts geändert habe.
Den Timer habe ich eingebaut, damit die Listview wieder sortiert wird.

Wie funktioniert das mit der Insert-Methode ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: Manfred X
Datum: 18.07.17 06:10

Zum Verständnis:
FileStuff ermittelt die Liste der Dateien im Ordner zu einem bestimmten Zeitpunkt.
Die Angaben werden nach dem Zeitpunkt der letzten Änderung fallend sortiert und
als Items in das zuvor "geclearte" Listview eingetragen.
Der FileSystemWatcher meldet danach neu hinzugekommene Dateien im Ordner.
Diese Angaben werden im Listview als weitere Items ergänzt und markiert.
(Der Neu-Aufruf von FileStuff/CreateFileList im Timer "überschreibt" die Markierung.)


Um die vom Watcher gemeldeten Datei-Angaben an die Stelle zu schreiben,
die der Sortierung der Liste gemäß Letzter Änderung entspricht, kann man folgende
Routine nutzen - statt "AddListItem".
(Ich habe sie nicht im Rahmen Deines Codes getestet, sollte aber funktionieren.)
 
 Private Function GetLWT(ByVal index As Integer) As Date
    'liest/konvertiert die LastWriteTime aus dem Item am Index
    Return CDate(ListView1.Items(index).Text)
 End Function
 
 
 Public Sub InsertListItem()
 
     If Not IO.File.Exists(FullPathToList) Then Exit Sub
     Dim fi As New IO.FileInfo(FullPathToList)
 
     Dim lwt As Date = fi.LastWriteTime
     Dim lvi As ListViewItem = Nothing
 
     'Voraussetzung:
     'ListViewItems sind nach Änderungszeit in Spalte 0 fallend sortiert
     With ListView1
        If lwt >= GetLWT(0) Then
           'frisch geänderte Datei in Ordner eingefügt: an den Listen-Anfang
           lvi = .Items.Insert(0, lwt.ToString)
        ElseIf lwt <= GetLWT(.Items.Count - 1) Then
           'uralte Datei in Ordner eingefügt: anhängen
           lvi = .Items.Add(lwt.ToString)
        Else
           For i As Integer = 0 To .Items.Count - 2
              If lwt < GetLWT(i) AndAlso lwt >= GetLWT(i + 1) Then
                 'Angaben zur Datei in sortierter Liste einordnen
                 lvi = .Items.Insert(i + 1, lwt.ToString)
                 Exit For
              End If
           Next i
        End If
    End With
 
    With lvi
       'Angaben im neuen Listitem ergänzen
       .SubItems.Add(fi.Name)
       .SubItems.Add(fi.FullName)
       'farblich als neu markieren
       .BackColor = Color.LightCyan
       .UseItemStyleForSubItems = True
    End With
End Sub
Aufruf der Methode im Eventhandler des Watchers:
Private Sub fsw_Created(sender As Object, _
    e As System.IO.FileSystemEventArgs) Handles fsw.Created
    FullPathToList = e.FullPath
    listview1.Invoke(New MethodInvoker(AddressOf InsertListItem))
End Sub
Hinweis:
Es werden im Beispiel nur die "Created"-Meldungen des Watchers
(Erstellen, Verschieben, Kopieren) beachtet.
Andere Meldungen werden ignoriert (Löschen, Umbenennen, Bearbeiten).
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: 00tommy
Datum: 18.07.17 11:09

Hallo Manfred,

danke für das toll Kommentierte Programm.
Habe heute alles noch mehrmals erstellt.
Problem ist immer noch, das er die neu dazugekommene Zeile einmal farbig anzeigt, das andere mal wird sie nicht erkannt.

Hängt wohl mit dem FileSystemWatcher zusammen. Aber es macht was es soll. TOP
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: Manfred X
Datum: 18.07.17 13:19

Hast Du den Timer rausgeschmissen?

Der Watcher erkennt alle Datei-Änderungen.
Im Programm verarbeitet werden aber nur: Erstellen, Kopieren, Verschieben (Created).

Wenn Du Benachrichtigungen zu anderen Datei-Modifikationen benötigst,
kannst Du z.B. zusätzlich das "Changed"-Ereignis verarbeiten:
Eine bereits vorhandene Datei im Ordner, die bearbeitet worden ist, wird dann
gemeldet, die Änderung des "LastWrite"-Eintrags wird in das korrespondierende
Listview-Item übernommen, dieses Item wird markiert und an den Anfang der Liste
"verschoben".
 
 Private Sub fsw_changed(sender As Object, _
        e As System.IO.FileSystemEventArgs) Handles fsw.Changed
 
    FullPathToList = e.FullPath
    lvwFileInformation.Invoke _
        (New MethodInvoker(AddressOf AdjustListItem))
 End Sub
 
 
 Private Sub AdjustListItem()
     If Not IO.File.Exists(FullPathToList) Then Exit Sub
     Dim fi As New IO.FileInfo(FullPathToList)
 
     Dim lwt As Date = fi.LastWriteTime 'neue LastWrite-Zeit
     Dim lvi As ListViewItem = Nothing
     Dim lvi_neu As ListViewItem = Nothing
     Dim fp As String = fi.FullName.ToUpper 'Pfad der geänd. Datei
 
     With ListView1
        For i As Integer = 0 To .Items.Count - 1
           lvi = .Items(i)
           With lvi
              'Überprüfen, ob der volle Pfad der geänderten Datei
              'mit dem gelisteten Pfad des Items identisch ist
              If fp = .SubItems(2).Text.ToUpper Then
                 'neue LW-Zeit eintragen evt. Now.ToString ??
                 .Text = lwt.ToString  
                 .BackColor = Color.Red 'Item markieren
                 .ForeColor = Color.White
                 .Font = New Font(.Font.Name, .Font.Size, FontStyle.Bold)
                 'Item-Kopie (Klon) für das Verschieben erstellen
                 lvi_neu = DirectCast(.Clone, ListViewItem)
                 Exit For
              End If
           End With
        Next i
 
        If lvi_neu IsNot Nothing Then
           'Die alte Item-Version aud Listview entfernen
           .Items.Remove(lvi)
           'Das modifizierte Item muss an den Listen-Anfang           
           .Items.Insert(0, lvi_neu)
        End If
    End With
 End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: 00tommy
Datum: 18.07.17 14:12

Die Timer sind raus.
Habe in
Private Sub FileStuff_Finished(sender As Object, e As _
  FileSystemStuff.FilesystemStuffArgs) Handles FileStuff.Finished
den .Path angepasst

jetzt funktioniert es. bis auf den C:\Windows Ordner, leider bringt das starten als Administrator auch nichts...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: Manfred X
Datum: 18.07.17 20:31

Dazu ein paar deutliche Worte:
1. Ein Anwendungsprogramm hat in einem Windows-Systemordner nichts zu suchen.

2. Im Windows-Ordner stehen mindestens 100000 (einhunderttausend) Dateien.
Was soll in dieser Vielzahl gelistet oder überwacht werden?
Das Füllen des Listview mit dieser Menge dauert eine ganze Weile.

3. Im Windows-Ordner gibt es gewöhnlich Unterordner, deren Zugriffsbeschränkung
auch mit Admin-Berechtigung nicht direkt umgangen werden kann (Rückgriff auf
Sicherheitseinstellungen erforderlich.)

4. Die üblichen Framework-Methoden für Filesystem-Zugriffe scheitern an
solchen Sperren. Die Anwendung des Hinweises von Franki ist erforderlich.

Ich habe das mal in die "FileSystemStuff"-Klasse nachträglich hineingefrickelt
(= Moderatoren-übliche Bezeichnung für besch... Code).
Der modifizierte Code-Teil dieser Klasse:
Private _FileInformationList As New List(Of FileInformation)(500)
Private _FileSystemErrors As New List(Of String)
 
Private Sub Getfiles(ByVal oDir As IO.DirectoryInfo)
   Dim oSubDir As IO.DirectoryInfo
   Dim oFile As IO.FileInfo = Nothing
 
   ' alle Dateien im aktuellen Ordner 
    Try
        For Each oFile In oDir.GetFiles()
           With oFile
              _FileInformationList.Add(New FileInformation(oFile))
              If _FileInformationList.Count Mod 100 = 0 Then
                  RaiseEvent Progress _
                  (Me, New FilesystemStuffArgs(_FileInformationList.Count))
              End If
            End With
         Next oFile
     Catch ex As Exception
         If oFile IsNot Nothing Then
            _FileSystemErrors.Add(oFile.FullName & ": " & ex.Message)
         End If
     End Try
 
     Try
        For Each oSubDir In oDir.GetDirectories()
           Getfiles(oSubDir)
        Next oSubDir
     Catch ex As Exception
        _FileSystemErrors.Add(oDir.FullName & ": " & ex.Message)
     End Try
  End Sub
 
 
  ''' <summary>Abfrage der Angaben zu den Dateien in einem Ordner</summary>
  ''' <param name="folder">Ordner, dessen Dateien gelistet werden sollen</param>
  ''' <param name="so">Unterordner einbeziehen?</param>
  Public Sub CreateFolderFileInfos(ByVal folder As String, _
        Optional so As IO.SearchOption = IO.SearchOption.TopDirectoryOnly)
 
     FileInformationArray = Nothing
     If Not IO.Directory.Exists(folder) Then Exit Sub
 
     Dim odir As New IO.DirectoryInfo(folder)
     Getfiles(odir)
     FileInformationArray = _FileInformationList.ToArray
 
     RaiseEvent Finished _
        (Me, New FilesystemStuffArgs(FileInformationArray.Length))
  End Sub
 
 
  Public ReadOnly Property ErrorMessages As String()
     Get
        Return _FileSystemErrors.ToArray
     End Get
  End Property
Im Anwendungsformular kann die Event-Routine "FileStuff_Finished"
jetzt ergänzt werden (möglicherweise umfangreicher Infotext!):
 Private Sub FileStuff_Finished(sender As Object, _
      e As FileSystemStuff.FilesystemStuffArgs) Handles FileStuff.Finished
 
     infotext = _
         "Dateien sind gelistet worden " & vbCrLf & "Gesamtzahl: " & _
         e.Count.ToString
 
     Dim errors() As String = FileStuff.ErrorMessages
 
     If errors IsNot Nothing AndAlso errors.Length > 0 Then
        infotext &= (vbNewLine & "Fehler: ")
        For i As Integer = 0 To errors.Length - 1
           infotext &= (vbNewLine & errors(i))
        Next i
     End If
 
     lblinfo.Invoke(New MethodInvoker(AddressOf SetInfoText))
     ListView1.Invoke(New MethodInvoker(AddressOf SetFileList))
 
     If FileStuff.FileInformationArray.Length > 0 Then
        With fsw
           .Filter = "*.*"
 
           .Path = IO.Path.GetDirectoryName(FileStuff.FileInformationArray( _
             0).fullpath)
           .IncludeSubdirectories = True
           .EnableRaisingEvents = True
        End With
     Else
        fsw.EnableRaisingEvents = False
     End If
 End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zuletzt geänderte Datei herausfinden 
Autor: Manfred X
Datum: 18.07.17 21:26

Ergänze folgende Routine in der Klasse "FileSystemStuff",
nachdem die Modifikationen aus meinem vorigen Post dort eingebaut
worden sind (Man beachte: CreateFolders: Plural-s)
Public Sub CreateFoldersFileInfos _
    (so As IO.SearchOption, ParamArray folders() As String)
 
    FileInformationArray = Nothing
 
    If folders Is Nothing OrElse folders.Length = 0 Then Exit Sub
 
    For i As Integer = 0 To folders.Length - 1
        If Not IO.Directory.Exists(folders(i)) Then Exit Sub
    Next i
 
    'Alle Ordner nacheinander abfragen
    For i As Integer = 0 To folders.Length - 1
       Dim odir As New IO.DirectoryInfo(folders(i))
       Getfiles(odir)
    Next i
 
    FileInformationArray = _FileInformationList.ToArray
    RaiseEvent Finished(Me, New FilesystemStuffArgs( _
      FileInformationArray.Length))
End Sub
Der Aufruf dieser Methode für mehrere Ordner im Formular:
Private Sub CreateFileList()
 
      'Die Ordner (beliebige Anzahl) werden hintereinander als Parameter
      'angegeben ....  
      FileStuff.CreateFoldersFileInfos(IO.SearchOption.AllDirectories, _
        "C:\Daten\abt1", "C:\Daten\abt2", "C:\xxx", ....)
End Sub
Eine Instanz des "FilesystemWatcher" kann nur jeweils einen Ordner überwachen.
Du benötigst deshalb für jeden Ordner einen separaten Watcher. Instanzen in eine
generische Liste packen und die Eventhandler-Routinen mit "Addhandler" zuordnen.

Beitrag wurde zuletzt am 18.07.17 um 21:30:29 editiert.
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