Bagaimana cara melacak perubahan ukuran file tertentu di Windows?

0

Saya ingin memonitor waktu ketika ukuran file log database SQL, databaseName.ldfberubah sehingga saya bisa membandingkannya dengan waktu di mana query SQL dieksekusi untuk menentukan query / perilaku SQL mana yang memiliki efek terbesar pada ukuran file saya. databaseName.ldffile.

Saya sudah mencoba alat pihak ketiga seperti Ukuran Matters dan Tampilan Perubahan Folder tapi masalahnya adalah mereka hanya mencatat perubahan terbaru. Saya ingin melihat semua perubahan dalam ukuran file dari waktu ke waktu.

Saya lebih suka jika menggunakan metode non-polling atau dipicu oleh peristiwa.

Menandai
sumber

Jawaban:

2

SysInternals Process Monitor mungkin membantu dengan filter berikut:

  • Path: databaseName.ldf(lebih suka path lengkap jika memungkinkan)
  • Operasi: WriteFile

Setelah tes Anda selesai, Anda dapat menyimpannya sebagai CSV atau XML untuk evaluasi Anda. Sayangnya, ukuran file ada di kolom detail, yang merupakan kolom teks yang mencakup hal-hal lain yang tidak menarik bagi Anda. Karena file log kemungkinan ditambahkan, Anda perlu menghitung sendiri panjang total (offset + panjang).

Cuplikan layar file log hipotetis


Dengan beberapa keterampilan pengkodean C #, Anda dapat menggunakan FileSystemWatcher . Manfaat: Anda dapat masuk dalam format yang paling cocok untuk Anda. Kerugian: kode Spaghetti yang berpotensi tidak diuji yang mungkin memiliki bug.

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);
                }
            }
        }
    }
}
Thomas Weller
sumber