Bestimmte Dateien in .Ini schreiben lassen

  • Abend,

    gibt es die Möglichkeit durch ein Skript was den ganzen Tag läuft, alle Dateien die einen bestimmten Dateityp haben mit Pfad in eine Ini schreiben zu lassen? Wenn ja hat jemand da evlt ein paar Codeschnipsel? :)

    Grüße

  • Ja ein Script kann den ganzen Tag laufen, ob das sinnvoll, angebracht oder effektiv ist? Kommt drauf an was du überhaupt tun willst.
    Kann man Dateipfade in eine ini schreiben? Klar kann man, ich schätze mal die Frage ist hier eher wo die Pfade herkommen, wie sie ermittelt werden usw. Was wolltest du nun genau tun?
    Ist eine ini Struktur sinnvoll oder angebracht? Kommt drauf an was später mit den Daten passieren soll. Was wolltest du tun?
    Kann man Dateien Anhand des Dateityps filtern? Ja kann man, auch hier wäre die Frage woher die Dateilisten überhaupt kommen sollen.

    Codeschnippsel? Schau dir die Hileeinträge zu diesen Funktionen an:

    [autoit]


    _filelisttoarray()
    iniwrite()
    iniwritesection()

    [/autoit]

    Ausserdem Hilfreich sollten die Hilfeeinträge du den Schleifenstatements sein:

    [autoit]


    for
    while
    do

    [/autoit]

    Mehr kann man dir anhand der mageren Beschreibung deines Vorhabens leider nicht helfen.

  • Willst du die Dateipfade mit Datei in die .ini schreiben? :huh:
    So klingt es nämlich in deiner abstrakten Formulierung. Und wenn du das vorhast würde ich dir empfehlen das zu lassen... Fremdstrukturen vertragen sich nicht gut mit einer .ini, da würden auch die Ini Funktionen in AutoIt den Geist aufgeben.

  • Tschuldigung das ich erst jetzt schreibe, hatte keine Zeit dank umzug etc...


    Es geht konkret darum, das ich jede geöffnete .DWG datei in eine txt oder ini datei speichern möchte.

    Und dann, durch ein Skript möchte ich genau diese Daten auf einen USB Stick sichern.


    Quasi ein Backup Programm um meine geänderten Zeichnungen sichern.


    mfg

    Daniel

  • Tja, wie gesagt...

    Zitat

    Fremdstrukturen vertragen sich nicht gut mit einer .ini, da würden auch die Ini Funktionen in AutoIt den Geist aufgeben.


    Dateien in eine .ini schreiben kannst du vergessen. ^^
    Die beste Möglichkeit dein Vorhaben durchzuführen, wäre wohl die Dateien in ein ZIP Archiv zu schreiben (dafür gibt es bereits mehrere UDFs in AutoIt, z.B. die hier: http://www.autoitscript.com/forum/topic/85…e__hl__Zip32au3). Falls dir Kompression nicht so wichtig ist, dann kannst du die Dateien ja auch einfach in einen Ordner packen. ;)
    Dann kannst du ja noch eine Art Index.ini erstellen in der die ursprünglichen Pfade der Dateien aufgelistet sind.

  • Danke erstmal für die Antwort.

    Mir ist völlig egal welche kompression das ganze hat. Ich möchte einfach alle am Tage geöffenten Dateien des typs .DWG per Knopfdruck auf einen USB Stick speichern.

    Deswegen kam ich auch auf die ini datei. Meinetwegen kann ich die Pfade auch nur in eine TXT Datei schreiben lassen...

    Hast du da evtl einen Codeschnipsel womit man, alle geöffneten Datein auflisten kann, sprich das das skript im Hintergrund bei allen neu geöffneten Dateien sofort den Pfad irgendwo abspeichert?

    Grüße

  • Zitat

    Deswegen kam ich auch auf die ini datei. Meinetwegen kann ich die Pfade auch nur in eine TXT Datei schreiben lassen...


    Die Pfade kannst du auch in eine INI schreiben.. Nur nicht die ganze Datei. Die Dateien würde ich einfach in einen Ordner kopieren und die dazugehörigen Pfade in die INI schreiben.

    Zitat

    Hast du da evtl einen Codeschnipsel womit man, alle geöffneten Datein auflisten kann, sprich das das skript im Hintergrund bei allen neu geöffneten Dateien sofort den Pfad irgendwo abspeichert?


    Ich bezweifle, dass da ein Codeschnipsel ausreicht. Ich weiß nicht wie man das überwachen könnte... Alle Dateien mit einer bestimmten Endung kopieren ist kein Problem, aber wie man überprüfen könnte wann die geöffnet sind weiß ich leider nicht.

  • In die ini/txt möchte ich nur den Pfad schreiben...

    Kennst du denn nen Code womit ich den Pfad einer momentanen Datei abspeichern kann?
    Oder war das dass was du leider nicht weisst?


    Grüße

  • Zitat

    Kennst du denn nen Code womit ich den Pfad einer momentanen Datei abspeichern kann?


    Da musst du mir erstmal erklären was eine momentane Datei ist... Zukünftige oder vergangene Dateien hab ich bis jetzt noch nicht verarbeiten können.

  • Mit den FileFind-Funktionen bekommst du die Pfade. Und dann halt per IniWrite schreiben.

  • Also ich bezweifle mal, dass man protokollieren kann welche Dateien den Tag über geöffnet werden, zumindestens dürfte es recht aufwendig werden sowas zu realisieren.

    Das ist btw auch eine seltsame Backupstrategie. Viel einfachher wäre es doch einen bestimmten Ordner und die darin enthaltenen Dateien auf Veränderung im Vergleich zum vorherigen Backup zu überprüfen und die Datei nur dann zu kopieren, wenn sie nicht identisch mit dem letzten Backup ist, also bearbeitet wurde. Das geht natürlich am besten wenn alle Dateien im selben Ordner sind. Wenn diese Dateien wild verstreut sind wird das schwieriger.

    Wie man Dateien auf Veränderung prüfen kann? Entweder man vergleicht simple die Dateigröße und das Änderungsdatum (kann man beides problemlos auslesen) oder man macht die Methode etwas zuverlässiger und erstellt eine Tabelle mit MD5 Checksummen.

  • Es geht darum das wenn ich fertig bin mit einer Zeichnung er diese, seperat auf meinen USB Stick (oder anderes Verzeichnis auf lokaler Festplatte) speichert.

    Die Zeichnungen liegen allesamt auf einem Server. Und ich wollte mir ersparen jedesmal wenn ich eine Zeichnung fertig bearbeitet habe diese extra zu kopieren etc...

  • Das Problem daran ist, das die Dateien nach jeder Änderung anders heissen...

    Deswegen wird das denke ich mal nicht das man einfach so die Größe der Datein prüfen kann durch den wechselden Namen oder?

    Grüße

  • Was heisst die haben einen anderen Dateinamen? Wird nach jeder Änderung eine neue Datei angelegt und die alte bleibt wie sie ist mit altem Namen? Wenn ja, dann brauchst du ja nur die neu hinzugekommenen Dateien kopieren, sprich den Ordner auf neue Dateien überwachen, die beim letzten mal noch nicht da waren und wenn eine neue dazu gekommen ist eben auf deinen Stick oder sonstwohin kopieren.

  • Könnte man in eine Ini datei schreiben welche Ordner überprüft werden sollen?

    Sprich wenn sich an den Ordnergrößen etwas ändert er den gesamten Ordner kopiert?

    Dateien ändern sich nach dem Schema "Hallo.dwg" -> "Hallo_a.dwg" -> "Hallo_b.dwg" -> "Hallo_c.dwg" ...

    Ich werde jetzt erstmal schlafen gehen und mir morgen die hoffentlich guten Nachrichten anschauen.

    Grüße

  • Da die Dateinamen nach diesem Schema einfach mit einem Suffix erweitert werden gehe ich mal davon aus, dass die alten Dateien noch da sind.
    Ich hab mal etwas zusammengebastelt. Bei mir funktioniert es zwar, aber ich bin mir immer noch nicht ganz sicher wie das bei dir aussieht.
    Das Script liest alle Pfade zu Verzeichnisen die überwacht werden sollen aus einer Textdatei aus. In dieser Datei müssen die pfade durch Zeilenumbrüche getrennt sein.
    Das könnte dann so aussehen:

    Paths.txt
    Code
    C:\Users\Name\Desktop\Test
    C:\Users\Name\Desktop\Weiterer Test


    Alle diese Pfade werden dann in einer SQL Datenbank gespeichert. Danach wird in regelmäßigen Intervallen eine Funktion gestartet die die Verzeichnisse nach .dwg Dateien durchsucht und mit den bekannten Dateien in der Datenbank vergleicht. Falls eine Datei noch nicht in der Datenbank steht, dann wird sie dort eingetragen, in das Backup Verzeichnis kopiert und ihr Pfad wird in eine Index.ini im Backup Verzeichnis geschrieben.
    Falls du ein Verzeichnis zur Überwachung hinzufügen willst, dann musst du es nur in die Paths.txt schreiben.

    Backup.au3
    [autoit]

    #include <SQLite.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; -Author: name22 (http://www.autoit.de)

    [/autoit] [autoit][/autoit] [autoit]

    Global $sPathFile = @ScriptDir & "\Paths.txt" ;Pfad zur Textdatei die die zu überwachenden Pfade enthält
    Global $sPath_Backup = @ScriptDir & "\Backup" ;Backup-Pfad in den die Dateien und die Index.ini kopiert werden
    Global $sPath_DB = @ScriptDir & "\Backup.sql" ;Pfad zur SQL Datenbank (falls sie nicht existiert wird sie erstellt)

    [/autoit] [autoit][/autoit] [autoit]

    Global $aPaths = StringRegExp(FileRead($sPathFile), "\s*(\V+)\s*", 3) ;Liest Pfade aus der Datei aus

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Startup(@ScriptDir & "\sqlite3.dll", False, True, "")

    [/autoit] [autoit][/autoit] [autoit]

    Global $hDB_Backup = _SQLite_Open($sPath_DB) ;Öffnet oder erstellt die Datenbank in der alle Daten zur überwachung der Verzeichnisse gespeichert werden
    _SQLite_Exec($hDB_Backup, "CREATE TABLE IF NOT EXISTS PathID (ID INTEGER PRIMARY KEY, Path TEXT);") ;Erstellt eine Zuordnungstabelle für alle Pfade

    [/autoit] [autoit][/autoit] [autoit]

    OnAutoItExitRegister("_Shutdown")
    HotKeySet("!q", "_Exit")
    AdlibRegister("_MonitorPaths", 3000) ;Ruft alle 3000 Millisekunden die Funktion auf, welche alle Verzeichnisse scannt

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(1000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _MonitorPaths()
    Local $aRow, $hSearch, $iID, $sFileName, $iCount_Backup = 0

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aPaths) - 1
    If _SQLite_QuerySingleRow($hDB_Backup, "SELECT ID FROM PathID WHERE Path=" & _SQLite_Escape($aPaths[$i]) & ";", $aRow) = $SQLITE_OK Then ;Falls Pfad existiert, dann...
    $iID = $aRow[0] ;ID des Pfads
    Else
    Do
    $iID = Random(10000, 99999, 1) ;Neue zufällige ID für den Pfad
    Until _SQLite_Exec($hDB_Backup, "INSERT INTO PathID VALUES (" & $iID & ", " & _SQLite_Escape($aPaths[$i]) & ");") = $SQLITE_OK ;Falls ID noch nicht existiert, dann...
    _SQLite_Exec($hDB_Backup, "CREATE TABLE IF NOT EXISTS path" & $iID & " (Files TEXT PRIMARY KEY);") ;Tabelle wird für neuen Pfad erstellt mit ID als Name
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $hSearch = FileFindFirstFile($aPaths[$i] & "\*.dwg") ;Suche nach .dwg Dateien im Verzeichnis initialisieren
    While True
    $sFileName = FileFindNextFile($hSearch) ;Gibt die nächste gefundene Datei zurück
    If @error Then ExitLoop ;Keine Dateien mehr
    If Not @extended Then ;@extended wird auf 1 gesetzt falls ein Verzeichnis gefunden wird, und das sollte ignoriert werden
    If _SQLite_Exec($hDB_Backup, "INSERT INTO path" & $iID & " VALUES (" & _SQLite_Escape($sFileName) & ");") = $SQLITE_OK Then ;Dateiname wird in Tabelle gespeichert, falls er noch nicht existiert
    FileCopy($aPaths[$i] & "\" & $sFileName, $sPath_Backup & "\" & $sFileName, 8) ;Datei in Backup-Verzeichnis kopieren
    IniWrite($sPath_Backup & "\Index.ini", "Files", $sFileName, $aPaths[$i]) ;Dateiname mit ursprünglichem Pfad in Ini schreiben.
    $iCount_Backup += 1
    EndIf
    EndIf
    WEnd
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return $iCount_Backup
    EndFunc ;==>_MonitorPaths

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func _Shutdown()
    _SQLite_Close($hDB_Backup)
    _SQLite_Shutdown()
    EndFunc ;==>_Shutdown

    [/autoit]


    Ich hoffe die Kommentare machen es verständlich was das Script macht.
    Alt+Q beendet das Script.
    Kannst es ja mal ausprobieren. Falls es nicht funktioniert, dann haben wir zumindest mal einen Ansatz. ;)