ხდომილებები და მათზე შესაბამისი პასუხი, ჩემი ერთ - ერთი ყველაზე საყვარელი თემაა, რაც უფრო მეტ ქმედების ხდომილებაზე შემიძლია გავცე პროგრამულად
შესაბამისი პასუხი მით უფრო მოქნილი და ხელსახყრელია ის ატრიბუტი რომელთანაც ვმუშაობ. არ ვიცი როგორ თქვენ მარა რამდენჯერმე კი გამჩენია სურვილი
მეკონტროლებინა თუ რა ამბები ტრიალებს ჩემს რომელიმე დირექტორიაში, რა დამემატა, რა გამომაკლდა ან რა ცვლილებები იქნა შეტანილი. რაღა თქმა უნდა
ჩვენი მაიკროსოფტელი მეგობრები აქაც გვიდგანან მხარში და გვთავაზობენ ფაილური სისტემის მონიტორინგისთვის ხელსაყრელ კლასებს. სწორად ერთ - ერთ მათგანზე
მინდა ვისაუბრო რომელსაც სახელად ქვია
FileSystemWatcher
ვისაც კი შეხება ჰქონია C# - თან კარგად იცის რამდენად ძიერი და ამავდოულად მარტივად გამოსაყენებელი კლასები არის დაწერილი მასში ფაილებთან სამუშაოდ
FileSystemWatcher - იც ნამდვილად არ არის გამონაკლისი. განვიხილოთ მისი ყოფაქცევა:
შექმენით რაიმე დირექტორია თქვენს მყარ დისკზე და გადაეცით კლასის კონსტრუქტორს მისი მისამართი სრტიქონული სახით.
FileSystemWatcher FSW = new FileSystemWatcher(Path);
ახლა შევხედოთ რამდენიმე საინტერესო ხდომილებებს Created, Deleted, Renamed. თითოული მათგანი აღიძვრება მაშინ როდესაც ჩვენს მიერ მითითებულ დირექტორიაში
შესაბამისად იქმნება, იშლება ან ხდება ფაილის სახელის გადარქმევა. C# - ი ავტომატურად იჭერს ამ ქმედებას და გვაძლევს იმის საშუალებას იგი დავამუშავოთ.
დემონსტრაციისათვის მე გავაკეთე ერთი პატარა კლასი რომელსაც ამჟამად წარმოგიდგენთ და შემდგომში გავარჩევ.
public class Watcher
{
public Watcher()
{
}
public Watcher(string Path,string Filter)
{
FileSystemWatcher FSW = new FileSystemWatcher(Path);
FSW.Created += new FileSystemEventHandler(FSW_Changed);
FSW.Deleted += new FileSystemEventHandler(FSW_Changed);
FSW.Renamed += new RenamedEventHandler(FSW_Renamed);
if (Filter != null || Filter != "")
{
FSW.Filter = Filter;
}
FSW.IncludeSubdirectories = true;
FSW.EnableRaisingEvents = true;
}
void FSW_Renamed(object sender, RenamedEventArgs e)
{
Console.WriteLine("Object - " + e.OldName + " was " + e.ChangeType.ToString().ToLower() +
" to " + e.Name + "\n");
}
void FSW_Changed(object sender, FileSystemEventArgs e)
{
Console.WriteLine("Object - " + e.Name + " " + e.ChangeType.ToString().ToLower() + "\n");
}
}
ე.ი. მე შევქმენი კლასი რომელსაც კონტრუქტროში ვაძვევ 2 პარამეტრს, დირექტორიის მისამართსა და ფილტრს, რომელზეც ოდნავ მოგვიანებით ვისაუბრებ. გამოვაცხადე
FileSystemWatcher - ის ახალი ინსტანცია და შევუდექი მის დამუშავებას.
პირველივე რაც გავაკეთე ეს იყო რომ შევქმენი შესაბამისი ხდომილებები ფაილის შექმნა, გადარქმევა და წაშლაზე. ხდომილებებს პარამეტრად გადაეცემათ იმ დელეგატი
მეთოდების სახელები რომლებიც ჩაატარებენ რაიმე ოპერაციებს შესაბამისი ქმედების მიხედვით. როგორც შეამჩნიეთ Created და Deleted ხდომილებას პასუხობს ერთი და იგივე
დელეგატი მეთოდი. მიზეზი: იმის გასარკვევად წაიშალა ფაილი თუ შეიქმნა ახალი მე მივმართავ e პარამეტრს რომელსაც მიბრუნებს ხდომილება.
e.ChangeType - ში
მოცემულია ის ინფორმაცია წაიშალა ფაილი თუ შეიქმნა.
Renamed ხდომილებაში ცოტა სხვაგვარადაა საქმე, მისი დელეგატი მეთოდი აღჭურვილია ოდნავ განსხვავებული პარამეტრებით, რომელთაგან არგუმენტის პარამეტრი გვიბრუნებს
ძველსა და ახალ სახელს.
ახლა დავუბრუნდეთ პარამეტრს სახელად Filter რომელიც მე გადავაწოდე კონსტრუქტორს. იგი გამოიყენება იმ შემთხვევაში თუ გვსურს მხოლოდ რომელიმე გაფართოების
ფაილების კონტროლი მაგალითად "*.txt" - ს გადაცემის შემთხვევაში მე ჩემს კონტროლერს ვეუბნები, ���ომ "Path - ით მითითებულ დირექტორიაში აკონტროლე მხოლოდ ტექსტური ფაილები"
დაწერილი კლასის რეალიზაციისთვის გამოყენებულია პატარა კონსოლ პროექტი შემდეგი კოდით:
static void Main(string[] args)
{
FolderMonitoring.Watcher W = new Watcher("F:\\object","");
Console.WriteLine("Press \'q\' to quit the sample.");
while (Console.Read() != 'q') ;
}
და დასასრულისათვის, რიდესაც ვუთითებთ კონტროლირებადი დირექტორიის სახელს, ჩვენ აგრეთვე შეგვიძლია მისი ქვედირექტორიების თვალყურის დევნებაც. ამას განსაზღვრავს
FileSystemWatcher კლასის
bool ტიპის თვისება IncludeSubdirectories,
რაც გამოყენებული მაქვს კონსტრუქტორში.
გავუშვათ პროგრამა და შევამოწმოთ შედეგები.
P.S. მაგალითის Source კოდები თანდართულია Attachment ფაილებში.
Program.cs (427.00 bytes)
Watcher.cs (1.10 kb)