sql Einlesen einer Dateistruktur, wie gelöschte Dateien ermitteln?

  • Hallo!

    Ich möchte einen Dateiindex per Sqlite von verschiedenen Laufwerken erstellen.

    Dazu lese ich die Dateien per DOS Befehl dir in eine Sqlite Datenbank ein.

    Das funktioniert nach einigem experimentieren recht gut und schnell.

    Mein Problem ist jetzt, dass ich gelöschte Dateien flaggen will. ( Ich hoffe das schreibt man so!?)

    Dazu habe ich mir folgende zwei Methoden vorgestellt.

    1.) Ich lese alle Dateien für ein Laufwerk aus in ein Array und und prüfe sie mit "If FileExists". Ich denke das wird aber recht langsam sein.

    2.) Ich importiere die Daten in die "echt" Tabelle und zusätzlich in eine temporäre Tabelle und vergleiche beide dann.

    Bei dieser Variante weiß ich allerdings noch nicht genau wie. Aber ich denke das lässt sich machen. :/

    Hat jemand von euch eine Idee oder einen konkreten Lösungsvorschlag? :Glaskugel:

    Hier meine Datenbank Struktur:

    autoit.de/wcf/attachment/89435/

    If not :?: then ?( else :thumbup:

  • Geht es dabei nur um lokale Dateien oder auch um welche auf externen Laufwerken (z.B. im Netzwerk)?

    Man könnte auch einen Thread laufen lassen, der bei Änderungen entsprechend Aktionen ausführt, da gibt es Windowsmechaniken für.

    Willst du das wirklich "nur" flaggen oder direkt anpassen? Ggf. wäre ein einfaches "neu einlesen" einfacher.

  • Hallo Moombas!

    Mir geht es darum es per SQL zu lösen, da dies "nur" ein Versuchsprojekt ist. (Ursprünglicher gedacht als schneller Index für eine statische Webseite)

    Also mehr ums Datenbank Design im Zusammenspiel mit der praktischen Anwendung in AutoIT.

    Mir gefällt die Idee des Flaggens. Dazu habe ich in meiner Tabelle die Spalte Kill.

    Beim Insert fülle ich diese mit einer 0 und wenn eben ein Datei gelöscht wurde sollte diese Spalte auf 1 gesetzt werden.

    Damit alles möglichst platzsparend ist, habe ich in der Datentabelle (IndexDB) einen Unique Index erstellt der verhindert, dass beim erneuten Einlesen die Daten mehrfach in die Tabelle geschrieben wird.

    Also Neue werden in die Tabelle geschrieben.

    Gelöschte Dateien müsste man eben Altstand mit Iststand vergleichen und dann das Flag setzen.

    Ich habe in meinem Programm ein Array mit dem Iststand und würde jetzt die Datenbank in ein Array auslesen und diese beiden Vergleichen.

    Ich hatte mir nur gedacht, ob es eventuell auch eine Möglichkeit gibt, dass sql(ite) das in der Datenbank bewerkstelligen kann.

    Eben keine Ahnung eventuell über einen Trigger, Temptable oder ...?

    If not :?: then ?( else :thumbup:

  • Damit alles möglichst platzsparend ist, habe ich in der Datentabelle (IndexDB) einen Unique Index erstellt der verhindert, dass beim erneuten Einlesen die Daten mehrfach in die Tabelle geschrieben wird.

    Also Neue werden in die Tabelle geschrieben.

    Folgendes Szenario:

    • Dateiname: "Ich-bin-eine-Datei.txt"

    • Datei wird gelöscht

    • Datei wird irgendwann mit selbem Namen neu erstellt

    Obwohl sie jetzt existiert und auch nichts mit der ersten Existenz der Datei zu tun hat, wird sie nicht erfasst. Eine Indexierung nur über den Namen ist somit fehleranfällig. Eine Kombination von Namen und Erstellungszeitpunkt, gespeichert unter einer GUID (z.B. mit _WinAPI_UniqueHardwareID) könnte hier Eindeutigkeit schaffen.

    Statt WinAPI kannst Du auch TypeLib nutzen:

    AutoIt
    Func _GUID_TypeLib()
        Local $oTypeLib = ObjCreate("Scriptlet.TypeLib")
        Return $oTypeLib.GUID
    EndFunc  ;==>_GUID_TypeLib
  • Statt WinAPI kannst Du auch TypeLib nutzen:

    Schön, TypeLib... kannte ich auch noch nicht.

    Verstehe nur nicht, wieso du dafür eine lokale Variable anlegst... macht ja nur Sinn, wenn du das Ergebnis von ObjCreate überprüfen willst.

    AutoIt
    Func _GUID_TypeLib()
        Return ObjCreate("Scriptlet.TypeLib").GUID
    EndFunc  ;==>_GUID_TypeLib
  • BugFix

    Danke für deinen Hinweis und das Code Beispiel!

    Das kann ich sicher noch in einem anderen Projekt gebrauchen.

    Da ich aber nichts weiter als die Datenstruktur ( Laufwerksbuchstabe, Ordner, Dateiname, Endung) erfasse ist es mir egal ob der gleiche Datensatz wieder "aktiviert" wird.

    Sprich die Routine die ich eben noch nicht habe sollte dann das Löschen Flag (in meinem Fall die Kill Spalte) von 1 auf 0 setzen.

    Bei Dateien würde ich anstatt deiner UniqueID den Hashwert der Datei heranziehen.

    Dadurch könnte man auch wiederhergestellte, gleiche Dateien (z.B: Windows Papierkorb) erkennen.

    If not :?: then ?( else :thumbup:

  • Das kann ich sicher noch in einem anderen Projekt gebrauchen.

    Ich hatte mir vor etlicher Zeit mal Möglichkeiten zum Erstellen von GUID zusammengesucht, vielleicht kannst du das auch brauchen: