| |
VB.NET - Ein- und UmsteigerRe: 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. | |
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 | |
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 | |
Re: Zuletzt geänderte Datei herausfinden | | | Autor: TheExOne | Datum: 27.11.07 13:38 |
| Thx, funkt 1a.
MfG Chris | |
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 | |
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. | |
Re: Zuletzt geänderte Datei herausfinden | | | Autor: 00tommy | Datum: 13.07.17 21:32 |
| Hi,
hat noch jemand einen Tipp, bzw ein Beispiel ? | |
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 | |
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ö | |
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 | |
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 | |
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 | |
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 ? | |
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. | |
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. | |
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 | |
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 | |
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). | |
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 ? | |
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). | |
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 | |
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 | |
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... | |
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 | |
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. | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevGraph (VB/VBA)
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere Infos
|