none
Rekursives bearbeiten von Dateien RRS feed

  • Frage

  • Hallo,

    ich muss Dateien auslesen, die in einem temporären Verzeichnis abgelegt und von dort durch ein anderen Prozess in ein Archiv hochgeladen werden.

    Der erste Prozess (den ich schreiben muss) soll die Dateien auslesen, bestimmte Werte in einer SQL-Tabelle erfassen. Sind die Daten vollständig(stimmig, geht der zweite Prozess durch und führt ein Upload der Dateien in ein Archiv durch, löscht danach das File im temporären Verzeichnis.

    Das Problem (besser Unschärfe) ist, wenn ich mittels Get-Items mir eine Liste ziehe mit allen Files, diese dann durchgehe um Werte auszulesen (was etwas Zeit in Abspruch nimmt), kann ein File bereits durch den zweiten Prozess hochgeladen und gelöscht sein.

    Ich kann jetzt mit "Get-ChildItem -Path ..." die Files ziehen und dann per "foreach ..." durchgehen, müsste dann aber immer erst prüfen ob das File besteht, sonst laufe ich in ein Fehler.

    Gibt es ein effizienten Weg die Files rekursiv durchzugehen ohne zuvor eine Liste mit Get-ChildItem zu ziehen und diese durchzugehen, also just in time die Files durchzugehen?

    Ich bin noch nicht so sattelfest in Powershell, frage auch mehr aus interesse...


    Viele Grüsse,
    Daniel


    • Bearbeitet DniBo Donnerstag, 19. Mai 2022 10:45
    Donnerstag, 19. Mai 2022 09:28

Antworten

  • Get-Childitem mit Weiterleitung erstellt keine direkte Liste sondern gib das Ergebnis Datei für Datei weiter:

    Get-Childitem ..... | for {}

    Aber wie mein Vorredner schon sagt, ohne den Ablageprozess zu ändern (Zielverzeichnis) hast du da keine Chance.
    Auch ein FileSystemWatcher ist kritisch, da für eine Datei Ereignisse mehrfach gemeldet werden können und die Bearbeitungszeit relevant wird.
    Hier ist dann Parallelisierung gefragt:

    - FileSystemWatcher
    - Je Ereignis einen Start-Job für die Datei

    Damit können dann mehrere Dateien gleichzeitig bearbeitet werden.


    • Bearbeitet Der Suchende Donnerstag, 19. Mai 2022 11:05
    • Als Antwort markiert DniBo Donnerstag, 26. Mai 2022 04:59
    Donnerstag, 19. Mai 2022 11:04

Alle Antworten

  • Moin,

    wenn Du auf den zweiten Prozess keinen Einfluss hast, hilft nur eins: Das Verzeichnis, von wo der zweite Prozess die Dateien abgreift, ist nicht identisch mit dem Verzeichnis, wo die Dateien ursprünglich landen, und Dein erster Prozess sorgt dafür, dass sie nach ordnungsgemäßer Erfassung in das "Upload-Verzeichnis" geschoben werden.

    EDIT: Und wenn Du jetzt sagst, dass Du auch auf die ursprüngliche Platzierung der Dateien keinen Einfluss hast, dann brauchst Du einen dritten Prozess, der nichts anderes macht, als immer wieder nach neuen Dateien zu schnüffeln (da kann man auch einen FileSystemWatcher für bemühen) und sie erst mal wegzuschieben, bis sie in der SQL-Tabelle ordnungsgemäß erfasst wurden.


    Evgenij Smirnov

    http://evgenij.smirnov.de


    • Bearbeitet Evgenij Smirnov Donnerstag, 19. Mai 2022 10:07
    • Als Antwort vorgeschlagen BOfH-666 Donnerstag, 19. Mai 2022 10:36
    Donnerstag, 19. Mai 2022 10:05
  • Get-Childitem mit Weiterleitung erstellt keine direkte Liste sondern gib das Ergebnis Datei für Datei weiter:

    Get-Childitem ..... | for {}

    Aber wie mein Vorredner schon sagt, ohne den Ablageprozess zu ändern (Zielverzeichnis) hast du da keine Chance.
    Auch ein FileSystemWatcher ist kritisch, da für eine Datei Ereignisse mehrfach gemeldet werden können und die Bearbeitungszeit relevant wird.
    Hier ist dann Parallelisierung gefragt:

    - FileSystemWatcher
    - Je Ereignis einen Start-Job für die Datei

    Damit können dann mehrere Dateien gleichzeitig bearbeitet werden.


    • Bearbeitet Der Suchende Donnerstag, 19. Mai 2022 11:05
    • Als Antwort markiert DniBo Donnerstag, 26. Mai 2022 04:59
    Donnerstag, 19. Mai 2022 11:04