Wie kann man Änderungen der Größe einer bestimmten Datei in Windows verfolgen?

Wie kann man Änderungen der Größe einer bestimmten Datei in Windows verfolgen?

Ich möchte den Zeitpunkt überwachen, zu dem sich die Größe einer SQL-Datenbankprotokolldatei databaseName.ldfändert, damit ich ihn mit dem Zeitpunkt vergleichen kann, zu dem SQL-Abfragen ausgeführt wurden, um zu ermitteln, welche SQL-Abfragen/Verhaltensweisen den größten Einfluss auf die Größe meiner databaseName.ldfDateien haben.

Ich habe Tools von Drittanbietern ausprobiert wieDie Größe ist wichtigUndOrdneränderungen anzeigenaber das Problem war, dass sie nur die letzte Änderung protokollierten. Ich wollte alle Änderungen der Dateigröße im Laufe der Zeit sehen.

Mir wäre es lieber, wenn es eine Methode ohne Polling oder eine durch Ereignisse ausgelöste Methode verwenden würde.

Antwort1

SysInternals Prozessmonitorkönnte bei folgenden Filtern hilfreich sein:

  • Pfad: databaseName.ldf(wenn möglich, vorzugsweise den vollständigen Pfad)
  • Betrieb:WriteFile

Sobald dein Test beendet ist, kannst du ihn als CSV oder XML für deine Auswertung speichern. Leider steht die Dateigröße in der Detailspalte, die eine Textspalte ist und andere Dinge enthält, die für dich nicht interessant sind. Da wahrscheinlich Logdateien angehängt werden, musst du die Gesamtlänge selbst berechnen (Offset + Länge).

Screenshot einer hypothetischen Protokolldatei


Mit einigen C#-Programmierkenntnissen können Sie dieDateisystemwächter. Vorteil: Sie können sich in dem für Sie am besten geeigneten Format anmelden. Nachteil: Möglicherweise ungetesteter Spaghetti-Code, der Fehler enthalten könnte.

using System;
using System.IO;

namespace FileSizeChangeLogger
{
    static class Program
    {
        static long lastSize;
        static FileInfo file = new FileInfo(@"D:\temp\myfilename.txt");

        static void Main()
        {
            lastSize = file.Length;

            var watcher = new FileSystemWatcher {Path = file.DirectoryName};
            watcher.Changed += OnFileChange;

            while (true)
            {
                watcher.WaitForChanged(WatcherChangeTypes.Changed);
            }
        }

        private static void OnFileChange(object sender, FileSystemEventArgs e)
        {
            if (e.FullPath.Equals(file.FullName, StringComparison.InvariantCultureIgnoreCase))
            {
                file.Refresh();
                var newSize = file.Length;
                if (newSize != lastSize)
                {
                    Console.WriteLine(file.Length);
                }
            }
        }
    }
}

verwandte Informationen