Discussion:
FullName geordnet nach LastWriteTime
(zu alt für eine Antwort)
JS
2011-04-02 17:28:15 UTC
Permalink
Hallo an alle,
ich möchte eine Liste der Dateiennamen (System.IO.FileInfo.FullName)
einer bestimmten Directory wobei diese Liste nach der letzten Änderung
der Datei geordnet sein soll. (System.IO.FileInfo.LastWriteTime).
Bis jetzt habe ich nur eine langsame Lösung. Ich laden alle
Dateinamen, hole die letzte Bearbeitung und ordnen das Ganz dann. So
weit so gut, aber die Directory hat mehr als 5000 Dateien und aus
diesem Grund ist diese Lösung zu langsam.
Meine Frage :
Gibt ein eine Möglichkeit diese Liste gleich geordnet zu bekommen,
oder noch besser ich brauchen eigentlich nur die letzten aktuellsten
100 Dateien alles andere ist Geschichte.
Danke für jeden guten Rat.

MfG Joachim Schmäck
Armin Zingler
2011-04-02 17:53:32 UTC
Permalink
Post by JS
Hallo an alle,
ich möchte eine Liste der Dateiennamen (System.IO.FileInfo.FullName)
einer bestimmten Directory wobei diese Liste nach der letzten Änderung
der Datei geordnet sein soll. (System.IO.FileInfo.LastWriteTime).
Bis jetzt habe ich nur eine langsame Lösung. Ich laden alle
Dateinamen, hole die letzte Bearbeitung und ordnen das Ganz dann. So
weit so gut, aber die Directory hat mehr als 5000 Dateien und aus
diesem Grund ist diese Lösung zu langsam.
Gibt ein eine Möglichkeit diese Liste gleich geordnet zu bekommen,
oder noch besser ich brauchen eigentlich nur die letzten aktuellsten
100 Dateien alles andere ist Geschichte.
Danke für jeden guten Rat.
Wie lange dauert es und welche Zeit wäre akzeptabel?

Das hier dauert 78ms bei 5800 Dateien:

Dim watch = Stopwatch.StartNew()
Dim dir As New IO.DirectoryInfo("D:\Users\Armin\Pictures\ScreenCapture\2011-04-02 19-38-25")

Dim q = From file In dir.GetFiles _
Order By file.LastWriteTimeUtc Descending _
Take 100

Dim topFiles = q.ToArray
MsgBox(watch.Elapsed.ToString)

Davon kannst du natürlich auch nur den Fullname selektieren.
LastWriteTimeUtc ist zuverlässiger wegen doppelter Stunde bei Zeitumstellung im Herbst.

Crosspost nach de.comp.lang.dotnet.vb gesetzt.
--
Armin
JS
2011-04-02 18:39:19 UTC
Permalink
Hallo Armin,
danke für deine schnelle Antwort.
Mit 78ms könnte ich natürlich gut leben. Meine Lösung braucht sicher
5s oder mehr.

Ich habe leider noch VB2005 und kann diesen Ausduck hier nicht
übernehmen.
      Dim q = From file In dir.GetFiles _
              Order By file.LastWriteTimeUtc Descending _
              Take 100
Der erzeugt einen Fehler.

MfG Joachim
Armin Zingler
2011-04-02 18:50:44 UTC
Permalink
Post by JS
Hallo Armin,
danke für deine schnelle Antwort.
Mit 78ms könnte ich natürlich gut leben. Meine Lösung braucht sicher
5s oder mehr.
Ich habe leider noch VB2005 und kann diesen Ausduck hier nicht
übernehmen.
Post by Armin Zingler
Dim q = From file In dir.GetFiles _
Order By file.LastWriteTimeUtc Descending _
Take 100
Der erzeugt einen Fehler.
Array.Sort(files, Function(item1, item2) item2.LastWriteTimeUtc.CompareTo(item1.LastWriteTimeUtc))

Von Files dann nur die ersten 100 verwenden.

Geht das?

Weiß nicht, wie du auf 5s kommst. ;-)
--
Armin
JS
2011-04-03 06:54:16 UTC
Permalink
Hallo Armin,
du hast natürlich recht! Die Zeit geht an dieser Stelle gar nicht
drauf. Es sind übrigens 7s für 320 Thumbnails aus Inventor Dateien.
Ich habe keinen anderen Weg gefunden, um aus stdole.IPictureDisp, nur
das kann mir der InventorThumbnailViewLib.ThumbnailProvider liefern,
Image zu machen.
Kannst du Potential für Zeiteinsparungen finden?

MfG Joachim


Private Sub SaveThumbnailsDB(ByVal AuswahlPfad As String)

Dim lDirInfo As New System.IO.DirectoryInfo(AuswahlPfad)

Dim watch As Stopwatch = Stopwatch.StartNew()

FilesSystem = lDirInfo.GetFiles("*.*",
System.IO.SearchOption.TopDirectoryOnly)

MsgBox(watch.Elapsed.ToString)

watch = Stopwatch.StartNew()

System.Array.Sort(Of System.IO.FileInfo)(FilesSystem,
AddressOf Me.CompareLastWriteTime)

MsgBox(watch.Elapsed.ToString)

Dim i As Integer
Dim im As Image
Dim Info As IO.FileInfo

watch = Stopwatch.StartNew()

For i = 0 To FilesSystem.Length - 1

L2.Text = i.ToString
Info = DirectCast(FilesSystem(i), IO.FileInfo)

----> im = GetImage(Info.FullName)
<--------------------------- das hier braucht die Zeit

'If Not im Is Nothing Then
' SQLKontaktKlasse.SaveThumbInfos(Info, im)
'End If


Next

MsgBox(watch.Elapsed.ToString)

End Sub


Protected Function GetImage(ByVal CurrentFileName As String) As Image

Dim PTh As New InventorThumbnailViewLib.ThumbnailProvider

Dim oPict As stdole.IPictureDisp

oPict = CType(PTh.GetThumbnail(CurrentFileName),
stdole.IPictureDisp)

Dim oImage As Image

oImage = ImageConverter.IPictureToImage(CType(oPict,
StdPicture))

Return oImage

End Function

Public Class ImageConverter

Public Sub New()
End Sub

Public Shared Function ImageToIPicture(ByVal Image As
System.Drawing.Image) As stdole.StdPicture
ImageToIPicture =
CType(Microsoft.VisualBasic.Compatibility.VB6.ImageToIPicture(Image),
stdole.StdPicture)
End Function


Public Shared Function IPictureToImage(ByVal Image As
stdole.StdPicture) As System.Drawing.Image
IPictureToImage =
Microsoft.VisualBasic.Compatibility.VB6.IPictureToImage(Image)
End Function
End Class
Armin Zingler
2011-04-03 11:27:53 UTC
Permalink
Post by JS
Hallo Armin,
du hast natürlich recht! Die Zeit geht an dieser Stelle gar nicht
drauf. Es sind übrigens 7s für 320 Thumbnails aus Inventor Dateien.
Ich habe keinen anderen Weg gefunden, um aus stdole.IPictureDisp, nur
das kann mir der InventorThumbnailViewLib.ThumbnailProvider liefern,
Nee, da kann ich dir leider nicht weiterhelfen. Was sind "Inventor"
Dateien? Im allgemeinen scheint mir die Dauer für diese Aktion nicht
unangemessen. Vielleicht helfen dir ja sogar die Links in Thomas'
Antwort in meinem Thread "Graphics.DrawImage blockiert UI-Thread"
weiter.
--
Armin
Thomas Scheidegger
2011-04-03 11:51:32 UTC
Permalink
Hallo Joachim und Armin
Post by JS
7s für 320 Thumbnails aus Inventor Dateien.
Ich habe keinen anderen Weg gefunden, um aus stdole.IPictureDisp, nur
das kann mir der InventorThumbnailViewLib.ThumbnailProvider liefern,
die Links in Thomas'Antwort ..."Graphics.DrawImage blockiert UI-Thread"
ich denke es geht da um Autodesk Inventor
http://en.wikipedia.org/wiki/Autodesk_Inventor

mit dem ganzen VBA-lastigen Umfeld:
http://modthemachine.typepad.com/my_weblog/2010/06/accessing-thumbnail-images.html

und somit um massives COM-Automation plus Interop mit managed .NET,
was immer viel Performance kostet für Bild-Umwandlungen/Marshalling.
Da ist die vorher genannte GDI+ -Bremse dagegen wohl sogar 'harmlos'.

Ich kenne diesen Inventor/ThumbnailProvider nicht,
ich schätze aber da kann man .NET-spezifisch wenig optimieren,
da müsste man uU gar schon irgendwie low-level Zugriff (C++) auf
Inventor-Dateien bekommen.
--
Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/
JS
2011-04-04 15:23:46 UTC
Permalink
Hallo Armin, hallo Thomas,
danke für eure Hilfe ich werde mich mal auf den angegebenen Links
umsehen.

MfG Joachim

Loading...