Как отслеживать изменения размера определенного файла в Windows?

Как отслеживать изменения размера определенного файла в Windows?

Я хочу отслеживать время изменения размера файла журнала базы данных SQL, databaseName.ldfчтобы можно было сравнить его со временем выполнения SQL-запросов и определить, какие SQL-запросы/поведение оказывают наибольшее влияние на размер моих databaseName.ldfфайлов.

Я пробовал сторонние инструменты, такие какРазмер имеет значениеиПросмотр изменений в папкено проблема была в том, что они регистрировали только последние изменения. Я хотел увидеть все изменения в размере файла с течением времени.

Я бы предпочел, чтобы он использовал метод без опроса или запускался событиями.

решение1

Монитор процессов SysInternalsмогут быть полезны следующие фильтры:

  • Путь: databaseName.ldf(предпочтительно полный путь, если возможно)
  • Операция:WriteFile

После завершения теста вы можете сохранить его в формате CSV или XML для оценки. К сожалению, размер файла указан в столбце «Подробности», который представляет собой текстовый столбец, включающий другие данные, которые вам не интересны. Поскольку файлы журналов, скорее всего, будут добавлены, вам нужно будет самостоятельно рассчитать общую длину (смещение + длина).

Скриншот гипотетического файла журнала


Имея некоторые навыки программирования на C#, вы можете использоватьFileSystemWatcher. Преимущество: вы можете войти в наиболее подходящий для вас формат. Недостаток: потенциально непроверенный спагетти-код, который может содержать ошибки.

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);
                }
            }
        }
    }
}

Связанный контент