Como rastrear alterações no tamanho de um determinado arquivo no Windows?

Como rastrear alterações no tamanho de um determinado arquivo no Windows?

Quero monitorar o momento em que o tamanho de um arquivo de log do banco de dados SQL databaseName.ldfmuda para que eu possa compará-lo com o horário em que as consultas SQL foram executadas, a fim de determinar quais consultas/comportamento SQL têm o maior efeito no tamanho do meu databaseName.ldfarquivos.

Eu tentei ferramentas de terceiros comoTamanho importaeVisualização de alterações de pastamas o problema é que eles registram apenas as alterações mais recentes. Eu queria ver todas as mudanças no tamanho do arquivo ao longo do tempo.

Eu preferiria que ele usasse um método sem votação ou fosse acionado por eventos.

Responder1

Monitor de processos SysInternalspode ser útil com os seguintes filtros:

  • Caminho: databaseName.ldf(prefira o caminho completo, se possível)
  • Operação:WriteFile

Quando o teste terminar, você poderá salvá-lo como CSV ou XML para sua avaliação. Infelizmente, o tamanho do arquivo está na coluna de detalhes, que é uma coluna de texto que inclui outras coisas que não são interessantes para você. Como os arquivos de log provavelmente são anexados, você mesmo precisa calcular o comprimento total (deslocamento + comprimento).

Captura de tela de um arquivo de log hipotético


Com algumas habilidades de codificação em C#, você pode usar oFileSystemWatcher. Benefício: você pode fazer login no formato que for mais adequado para você. Desvantagem: código Spaghetti potencialmente não testado que pode conter bugs.

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

informação relacionada