• 30-10-2019, 12:41:19
    #1
    Merhabalar arkadaşlar,

    FileSystemWatcher dosyaizleyici = new FileSystemWatcher(dinlenenklasor);
    dosyaizleyici.Changed += new FileSystemEventHandler(_degisti);
    dosyaizleyici.Filter = dinlenendosya;
    dosyaizleyici.NotifyFilter = NotifyFilters.LastAccess
    | NotifyFilters.LastWrite
    | NotifyFilters.FileName
    | NotifyFilters.DirectoryName;
    dosyaizleyici.EnableRaisingEvents = true;

    şeklinde bir kod kullanıyorum. Dinlenen dosyayı normal bir txt yaptığımda sorunsuz yakalayıp işlem yapıyorum. Fakat asıl işim, bir uygulamanın lock ettiği txt dosyasına yeni kayıt geldiğinde yakalamak. Normal txt yakalanabilirken, lock olan txt ben klasörü refresh ettiğimde veya notepad ile açtığımda yakalıyor. Otomatik yakalaması için ne yapmalıyım?
  • 30-10-2019, 12:58:12
    #2
    FileSystemWatcher ile bir dosyanin lock olup olmadigini anlayamazsin, watcher sadece son yazim tarihine bakip degisip degismedigini haber veriyor.

    Kendin bir timer ile ya da kendi eventini yazarak bu olayi yapabilirsin

    https://stackoverflow.com/a/937558/1022138

    ya da daha farkli bir yol izlemek istiyorsan, hangi process'in dosyayi kullandigini bulup bir seyler yapabilirsin
    https://code.msdn.microsoft.com/wind...ocess-704839f4
  • 08-11-2019, 09:30:52
    #3
    Merhabalar @ertan2002 teşekkür ederim öncelikle ilgin için. Yapmak istediğim şey tam olarak şu.

    Bir iOT cihazım var ve tetiklendiğinde bit txt dosyasına değer atıyor. Benim yapmak istediğim şey ise, bu txt değişikliğini yakalayıp arada bir iletişim sağlamak. Normal senaryoya göre herşey tamam. Hiç sıkıntı yok. Fakat iOT cihaz txt dosyasını lock ediyor ve değerleri o şekilde yazıyor. Bu da benim o txt dosyasını FileSystemWatcher ile izlememi engelliyor. Tetikleme işlemi gerçekleşmiyor.

    Dosyayı her türlü read modda da okuyamıyorum lock olduğu için, tetikleme işlemini yakaladığımda dosyanın x_temp.txt olarak copy'sini alıp onunla işlem yapıyorum. O kısmı önemli değil ama başka bir uygulamanın lock ettiği txt dosyasından data yakalayamamak çok kötü.

    Bunun için önerebileceğin bir yöntem var mıdır?
  • 08-11-2019, 12:45:20
    #4
    @wmismail
    Anladim hocam, senin icin basit bir kod yazdim,

    Bu kod her 500 ms'da bir sürekli olarak dosyaya bir seyler yazar (yani dosya lock pozisyonunda, senin sistemindeki gibi..
    -Winform app
    public partial class Form1 : Form
    {
    private System.IO.StreamWriter sw;
    private System.Timers.Timer timer;
    public Form1()
    {
    InitializeComponent();
    sw = new System.IO.StreamWriter(@"C:Tempdata.txt",true);
    sw.AutoFlush = true;
    timer = new System.Timers.Timer(500);
    timer.Elapsed += (sender, args) =>
    {
    sw.WriteLine("This is a temp text on " + DateTime.Now.ToString());
    };
    }
    
    private void BtnWrite_Click(object sender, EventArgs e)
    {
    timer.Start();
    }
    }
    Simdi ise txt dosyamizin boyutunu belirli sürelerde kontrol ederek iceriginin degisip degismedigini anlayabiliriz
    - Console App
    private static System.Timers.Timer timer;
    private static System.IO.FileInfo _fileInfo;
    private static long lastLength;
    static void Main(string[] args)
    {
    
    timer = new System.Timers.Timer(1000);
    timer.Elapsed += (sender, eventArgs) =>
    {
    _fileInfo.Refresh();
    if (lastLength == _fileInfo.Length) return;
    lastLength = _fileInfo.Length;
    Console.WriteLine("File content has been changed!");
    };
    
    _fileInfo= new System.IO.FileInfo(@"C:Tempdata.txt");
    lastLength = _fileInfo.Length;
    timer.Start();
    Console.ReadKey();
    }
    Yukaridaki kod ise her 1 saniye bir olarak dosyanin boyutunu kontrol ediyor. Eger degisiklik varsa ekrana yazi yazdiriyor..

    Bu sekilde sistem calisiyor. Tabi performans acisindan ne kadar saglikli olur acikcasi bilmiyorum, aklima gelen ilk yolla yaptim. Umarim faydali olur. Kolaygelsin