ডিরেক্টরি নিরীক্ষণের জন্য ফাইলসিস্টেমওয়াটার ব্যবহার করে


104

আমি একটি ডিরেক্টরি নিরীক্ষণ করতে এবং এটিতে ফেলে দেওয়া ফাইলগুলিকে অন্য ডিরেক্টরিতে সরাতে একটি উইন্ডোজ ফর্ম অ্যাপ্লিকেশন ব্যবহার করছি।

এই মুহুর্তে এটি ফাইলটি অন্য ডিরেক্টরিতে অনুলিপি করবে, তবে অন্য ফাইল যুক্ত করা হলে এটি কোনও ত্রুটি বার্তা না দিয়ে শেষ হবে। কখনও কখনও এটি তৃতীয়টি শেষ হওয়ার আগে দুটি ফাইল অনুলিপি করে।

এটি কি কারণ আমি কনসোল অ্যাপ্লিকেশনটির চেয়ে উইন্ডোজ ফর্ম অ্যাপ্লিকেশন ব্যবহার করছি? প্রোগ্রামটি শেষ হতে এবং ডিরেক্টরিটি দেখার চেষ্টা চালিয়ে যাওয়ার কোনও উপায় আছে কি?

private void watch()
{
  this.watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                         | NotifyFilters.FileName | NotifyFilters.DirectoryName;
  watcher.Filter = "*.*";
  watcher.Changed += OnChanged;
  watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
  //Copies file to another directory.
}

public void Dispose()
{
  // avoiding resource leak
  watcher.Changed -= OnChanged;
  this.watcher.Dispose();
}

উত্তর:


147

সমস্যা ছিল ফিল্টার ফিল্ডিং। প্রোগ্রামটি এমন একটি ফাইল খোলার চেষ্টা করছিল যা এখনও অনুলিপি করছিল। আমি লাস্ট রাইট বাদে সমস্ত বিজ্ঞপ্তি ফিল্টার সরিয়েছি।

private void watch()
{
  FileSystemWatcher watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastWrite;
  watcher.Filter = "*.*";
  watcher.Changed += new FileSystemEventHandler(OnChanged);
  watcher.EnableRaisingEvents = true;
}

7
হাই, আমি এই পদ্ধতির ব্যবহার করছি কিন্তু আমি যখন কোনও ফাইল অনুলিপি করি তখন ঘটনাটি দু'বার উত্থাপিত হয়: ফাইলটি খালি তৈরি হওয়ার সময় (অনুলিপি শুরু হয়) এবং অনুলিপি শেষ হওয়ার পরে আরও একবার। এই সদৃশ ইভেন্টটি কীভাবে এড়ানো যায়, যে কোনও ফিল্টার এটির কাস্টম নিয়ন্ত্রণ ছাড়াই এটি পরিচালনা করতে সক্ষম?
ধাফেজমেমে

@ ডাল্ফেজেম আমার ফোল্ডারে যদি আমার অ্যাপ্লিকেশনটির জন্য অর্থপূর্ণ কিছু উপস্থিত হয় তবে আমি উভয় ইভেন্টই পরীক্ষা করে দেখি।
ইফতেখারী

30

আপনি ফাইল হ্যান্ডলিং কোড সরবরাহ করেন নি, তবে আমি ধরে নিয়েছি আপনি প্রথম যখন এ জাতীয় কিছু লিখছেন তখন সবাই একই ভুল করেছেন: ফাইলটি তৈরির সাথে সাথে ফাইলওয়্যাচার ইভেন্টটি উত্থাপিত হবে। তবে ফাইলটি শেষ হতে কিছুটা সময় লাগবে। উদাহরণস্বরূপ 1 জিবি ফাইলের আকার নিন। ফাইলটি অন্য কোনও প্রোগ্রাম দ্বারা তৈরি করা হতে পারে (এক্সপ্লোরারএক্সএক্স কোথাও থেকে এটি অনুলিপি করে) তবে এই প্রক্রিয়াটি শেষ হতে কয়েক মিনিট সময় লাগবে। ইভেন্টটি তৈরির সময় উত্থাপিত হয়েছিল এবং আপনার ফাইলটি অনুলিপি করার জন্য প্রস্তুত হওয়ার জন্য অপেক্ষা করতে হবে।

লুপটিতে এই ফাংশনটি ব্যবহার করে আপনি কোনও ফাইল প্রস্তুত হওয়ার জন্য অপেক্ষা করতে পারেন ।


26

কারণটি হতে পারে যে কোনও পদ্ধতির জন্য পর্যবেক্ষককে স্থানীয় পরিবর্তনশীল হিসাবে ঘোষণা করা হয় এবং পদ্ধতিটি শেষ হয়ে গেলে এটি আবর্জনা সংগ্রহ করা হয়। আপনি এটি একটি শ্রেণীর সদস্য হিসাবে ঘোষণা করা উচিত। নিম্নলিখিত চেষ্টা করুন:

FileSystemWatcher watcher;

private void watch()
{
  watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                         | NotifyFilters.FileName | NotifyFilters.DirectoryName;
  watcher.Filter = "*.*";
  watcher.Changed += new FileSystemEventHandler(OnChanged);
  watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
  //Copies file to another directory.
}

19
watcherপরিবর্তনশীল জীবিত রাখা হয় (আবর্জনা সংগ্রহ করা হয়নি) কারণ তিনি পরিবর্তিত ইভেন্টের সদস্যতা নিয়েছিলেন।
অ্যাডস্পেস

4
আমি বিশ্বাস করি এটি প্রকৃতপক্ষে কারণ সক্ষম করুন রাইজিংইভেন্টস সেট করা আছে true। আমি মনে করি না যে মেম্বার ইভেন্ট হ্যান্ডলারদের স্ট্যাটাসটি আবর্জনা সংগ্রহের সাথে করা উচিত। আমি মনে করি অ্যাফলিরিজাইংএভেণ্টস এর আছে, যা আমি অনুকূলভাবে বলতে পারি, এই ক্ষেত্রে একটি বিশেষ আচরণ।
মাতিয়াস গ্রিওনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.