نظارت بر ایجاد فایل جدید در یک پوشه ویندوز و اجرای اعمال خاص – به زبان ساده
در هر سیستم عاملی فایلها به طور مرتب در حال تغییر و تحول هستند. هر زمان برخی فایلها ایجاد میشوند، برخی حذف میشوند، برخی تغییر مییابند و همه اینها جزئی از وظایف معمول یک سیستم عامل محسوب میشوند. برخی اوقات، زمانی که یک فایل تغییر مییابد، ممکن است موجب ایجاد ناپایداری در اپلیکیشنهای وابسته به خود شود. مثلاً با تغییر یافتن یک شماره پورت در فایل مشخصات یا عوض شدن یک پارامتر در فایل مانیفست انتشار و یا حتی اصلاح یک کد در محیط پروداکشن بدون این که از مجرای کنترل نسخه عبور کند، همگی میتوانند موجب بروز مشکلاتی شوند. در ادامه این مقاله با روش نظارت بر ایجاد فایل جدید در یک پوشه ویندوز و اجرای اعمال خاص به تناسب آن آشنا خواهیم شد.
مهندسان به عنوان بخشی از مدیریت این سیستمهای عامل باید روشی برای نظارت بر وقایع مهم فایلها و اتخاذ تصمیم مناسب در هر مورد داشته باشند. به این منظور میتوان از کلاس NET FileSystemWatcher. و PowerShell استفاده کرد.
در محیط NET. و NET Core. کلاس FileSystemWatcher که در فضای نام System.IO قرار دارد به نظارت بر فایلها مبادرت میکند. در PowerShell این کلاس میتواند به خصوص همراه با کارکردهای پاورشل بسیار مفید باشد.
وهلهسازی از FileSystemWatcher
با اجرای دستور زیر در پاورشل میتوانید یک وهله از این کلاس بسازید:
$watcher = New-Object System.IO.FileSystemWatcher
پس از انجام این کار، باید اعلام کنید که کدام پوشه مورد نظارت قرار گیرد. این کار از طریق تعیین پارامتر Path روی شیء FileSystemWatcher به مسیری که پوشه باید مورد نظارت قرار گیرد، انجام میگیرد.
اگر پوشهای به نام WatchThisFolder در مسیر \:C در ویندوز وجود داشته باشد، میتوانید با اجرای دستور زیر کلاس FileSystemWatcher را روی آن تنظیم کنید:
$watcher.Path = 'C:\WatchThisFolder
از آنجا که این کلاس نیز مربوط به.NET Core است، میتوانید این کار را روی سیستمهای لینوکس یا Mac OS نیز به همان روش سیستمهای ویندوزی اجرا کنید. برای نمونه اگر روی لینوکس اوبونتو پوشهای به نام WatchThisFolder زیر دایرکتوری کاربر جاری داشته باشید، باید دستور زیر را اجرا کنید:
$watcher.Path = '/home/ubuntu/WatchThisFolder'
بقیه نمونه کدها در این مقاله روی همه پلتفرمها بدون هیچ تغییری قابل اجرا هستند.
تحریک رویدادها از FileSystemWatcher
اینک که یک کلاس FileSystemWatcher جدید داریم، میتوانیم به سازوکار پشت پرده آن نگاه کنیم تا بیشتر با کارکردش آشنا شویم. برای مشاهده انواعِ خاصی از رویدادهای فایل سیستم که FileSystemWatcher میتواند مورد نظارت قرار دهد، میتوانید دستور زیر را وارد کنید:
$watcher | Get-Member -MemberType Event
دستور Get-Member همه موارد مربوط به شیئی که به این دستور ارسال میشود را نمایش میدهد و با افزودن فیلتر MemberType میتوانید یک دستهبندی خاص را ببینید که در این مورد «رویدادها» (events) است. این رویدادها شامل موارد زیر هستند:
- Changed
- Created
- Deleted
- Disposed
- Error
- Renamed
زمانی که یک یا چند مورد از رویدادهای FileSystemWatcher در مسیر شیء مورد نظارت، تشخیص داده شوند، شیء watcher یک رویداد اکسترنال ایجاد میکند که برای آن میتوان اکشنهایی تعریف کرد.
اکنون که شیء watcher میداند چه چیزی را مورد نظارت قرار دهد و ما نیز میدانیم که چه رویدادهایی را تحت نظر دارد، باید تنظیم کنیم که وقتی عملی تشخیص داده شد، رویدادی ایجاد شود. این کار با اجرای دستور زیر ممکن میشود:
$watcher.EnableRaisingEvents = $true
این فلگ را میتوان به عنوان یک سوئیچ خاموش/روشن برای watcher$ تصور کرد. اگر سوئیچ خاموش باشد، در صورت ایجاد هر نوع تغییری، هیچ اتفاقی نمیافتد. همچنین میتوانید به آن اعلام کنید که به فایلها و پوشههای داخل پوشه دیگری در مسیر تعیینشده نگاه کند. به این منظور باید فلگ IncludeSubdirectories را روی مقدار true قرار دهید و این کار به همان روشی که در مورد فلگ EnableRaisingEvents عمل کردیم، انجام میگیرد.
تعریف کارهایی که باید انجام یابند
زمانی که شیء watcher تنظیم شد، باید یک کار (Action) به آن بدهیم که در زمان تشخیص ایجاد تغییر، اجرا کند. این کار میتواند به سادگی نوشتن یک لاگ سیستم باشد یا به اندازه تحریک جایگزینی وهله با یک clean pull از سورس کد دشوار باشد.
برای شروع باد یک بلوک اکشن در کد خود تعریف کنیم. بلوک زیر برای نوشتن در کنسول استفاده میشود:
در این کد متغیرهایی از رویداد با استفاده از متغیر $event به دست میآیند. این متغیر در زمان ایجاد شیء watcher ساخته میشود. به محض این که این رویداد خاتمه یابد متغیر نیز خاتمه مییابد. یعنی این متغیر صرفاً دادههای مربوط به این رویدادهای خاص را نگهداری میکند.
استفاده از Register-ObjectEvent
تا اینجا کلاس FileSystemWatcher را تنظیم و اکشنهایی که میخواهیم در زمان وقوع اتفاق خاص بیفتند را نیز ارائه کردهایم. اکنون این دو بخش از هم مجزا هستند و اطلاعی از هم ندارند. برای این که کاری کنیم آنها به هم وصل شوند، باید اکشنها را در رویداد ثبت کنیم. پاورشل یک cmdlet کامل به این منظور دارد که Register-ObjectEvent نام دارد. برای استفاده از Register-ObjectEvent باید سه چیز را ارسال کنیم:
- شیء FileSystemWatcher
- نوع رویداد برای تحریک کردن اکشن
- اکشنهایی که باید قبلاً تعریف شده باشند
اگر همه چیز را به همان ترتیب که در لیست فوق ارائه شده آماده کنید، چیزی مانند دستور زیر به دست میآید:
Register-ObjectEvent $watcher 'Event Action' -Action $action
Event Action را میتوان با هر رویدادی از FileSystemWatcher جایگزین کرد، اما این یک دموی خوب خواهد بود.
تست کردن
اکنون میتوانیم همه مواردی که تنظیم کردیم را تست کنیم. در این بخش باید یک فایل جدید در دایرکتوری مشخصشده ایجاد کنیم، اکشن رویداد را ببینیم و سپس رویداد را غیر فعال کرده و از حالت ثبت خارج کنیم.
برای ایجاد یک فایل جدید و تحریک یک رویداد، باید دستور زیر را در پاورشل اجرا کنید. ما این کار را روی لینوکس اوبونتو انجام میدهیم، اما شما میتوانید آن را روی ویندوز هم اجرا کنید، فقط باید به جای /home/ubuntu/ از \:C و به جای / از \ استفاده کنید.
New-Item -Path "/home/ubuntu/WatchThisFolder/newFile" -ItemType File
به محض این که دستور فوق را وارد کنید، رویداد اجرا شده و اکشن را تحریک میکند.
File newFile at path /home/ubuntu/WatchThisFolder/newFile was Created at 09/26/2019 20:49:54
این رویداد هر زمان که یک فایل جدید در آن دایرکتوری یا هر چیزی داخل آن ایجاد کنید و اگر فلگ IncludeSubdirectories فعال باشد ایجاد میشود. اکنون که با روش ایجاد رویداد آشنا شدید، میتوانید با اجرای دستور زیر آن را خاموش کنید:
$watcher.EnableRaisingEvents = $false
اینک اگر یک فایل ایجاد کنید، هیچ رویدادی نمایش نمییابد. این وضعیت در حالتی که مشغول دیباگ هستید و نمیخواهید در زمان کار روی سیستم فایل چیزی ارائه نشود، مفید خواهند بود. زمانی که کارتان پایان یافت، دستور زیر را اجرا کنید تا ثبت رویداد در اکشن غیر فعال شود:
Get-EventSubscriber | Unregister-Event
اکنون حتی اگر فلگ EnableRaisingEvents فعال باشد و اکشن رخ دهد، اکشنی ایجاد نمیشود.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای عمومی
- آموزش مقدماتی Windows PowerShell (ویندوز پاورشل)
- مجموعه آموزشهای ویندوز
- پنج دلیل قانعکننده برای استفاده از برنامه PowerShell
- ویندوز و ۱۰ امکان قدرتمند آن که نادیده گرفته میشوند
- ویندوز ۱۰ و نحوه غیر فعال کردن اعلانها در آن
==