PDA

View Full Version : فهمیدن تغییرات فایل بدون تایمر



Touska
یک شنبه 15 خرداد 1384, 10:20 صبح
اگر بخواهیم بدون اینکه خود فایل رو چک کنیم

بخواهیم بفهمیم که فایل تغییر کرده است یا نه چه باید کرد ؟ :گیج:

نوع فایل هم text معمولی

محمد میرمصطفی
دوشنبه 16 خرداد 1384, 00:00 صبح
دوتا API داره که یادم نیست. دارم می‏گردم پیدا کردم می‏گم. ولی این رو به VB.NET پیدا کردم علی‏الحساب:

Figure 10 Using System.IO.FileSystemWatcher

Public Sub StartMonitor()
'create the file system watcher
Dim fw As New FileSystemWatcher()
Dim result As WaitForChangedResult
fw.Path = dirpath
'watch only for changes in files
fw.Target = IO.WatcherTarget.File
'do not recursively watch subdirectories
fw.IncludeSubdirectories = False
'set the filter
fw.Filter = "*.xml"
'set the event handlers via delegates
AddHandler fw.Created, New FileSystemEventHandler( _
AddressOf Me.OnFileCreated)

'tell it to start watching
fw.Enabled = True
Try
Do
result = fw.WaitForChanged( _
WatcherChangeTypes.Created)
Loop
Catch e As Exception
Trace.WriteLineIf(BITraceLevel.TraceError, _
"An exception occurred while waiting for file: " & _
e.ToString())
End Try
End Sub

'Event handler for Created event
Public Sub OnFileCreated(ByVal source As Object, _
ByVal e As FileSystemEventArgs)
'other code omitted
End Sub


--------------------------------------------------------------------------------
Figure 11 Checking File Status

'•••
'Other code omitted
Dim i As Integer
For i = 0 To 2
If GetExclusiveAccess(fileInfo.FilePath) Then
Exit For
ElseIf i = 2 Then
Trace.WriteLineIf(BITraceLevel.TraceError, _
"Could not obtain exclusive access to file " & _
fileInfo.FilePath)
Exit Sub
End If
Trace.WriteLineIf(BITraceLevel.TraceInfo, _
"Retrying file " & CStr(fileInfo.filenumber))
Thread.Sleep(5000)
Next
'the file is closed so we can process it
'Other code omitted
'•••

Private Function GetExclusiveAccess( _
ByVal FilePath As String) As Boolean
Try
Dim theFile As New File(FilePath)
Dim strm As Stream = theFile.Open( _
IO.FileMode.Append, _
IO.FileAccess.Write, _
IO.FileShare.None)
'if we succeed, we can let it go
strm.Close()
GetExclusiveAccess = True
Catch e As Exception
Trace.WriteLineIf(BITraceLevel.TraceInfo, _
"Error opening input file " & _
FilePath & " exception info: " & e.ToString)
GetExclusiveAccess = False
End Try
End Function

محمد میرمصطفی
دوشنبه 16 خرداد 1384, 00:23 صبح
من قبلا یه بار اینکاروو کردم ولی الان هرچی می گردم پیدا نمی کنم. یادمه یه EventObject می ساختم که یه فولرد یا فایل رو یه اصطلاح Watch می کرد. بعد با WaitForSingleObject تو یه Thread منتظر تغییرات می میموندم. به محض اینکه پیداش کردم، در اختیارتون میزارم.

فعلا بای

brians2000
دوشنبه 16 خرداد 1384, 05:12 صبح
سلام.

ببین... دستورات SHELL و در عین حال دات نت ایونتهایی دارند که تو می تونی از تغییرات در یک دایرکتوری مثلا یا در یک فایل مطلع بشی... و کامپوننتهایی در هر دو هست ولی ببینیم کیس کاری تو چیه! می تونی یه دایرکتوری رو واچ کنی و توضحات بالا توی دات نت و چند تا فرمان توی شل اینکارو برات انجام می دهند به محض تغییرات توی یه دایرکتوری می تونی یه ایونت بگیری.

این چیزی که می گم در حالتیه که بخوای از یه فایل تکست معمولی ورودی بگیری... باید کار با فایلهای باینری رو بلد باشی و پوینتر و یا کار با آبجکت رو بلد باشی ... کار با ای پی آی در صورتی که می خواهی از روش بالا استفاده کنی توصیه می شه. در دات نت یک روش داریم وتوی 32 بیتی روش دیگه ای... اگر می خواهی فقط بدونی اندازه اش عوض شده اون دنگ و فنگ نداره اون بالاییه کاربرد داره توی ایونت سایز و تاریخ آخرین تغییر رو چک کن.


تو یه برنامه دیگه داری می خوای فایل تکست خروجیش که عوض میشه توهم تغییر بدی :

اولا.... تو باید برنامه ات قبل اون برنامه اجرا بشه ... فایل رو در حالت fmsharedenynon و نوشتن و خوندن رو هم باید اینجوری اضافه کنی (من توصیه می کنم از استریم استفاده کنی که بتونی روی دات نت هم راحت بیای ) گ


fmsharedenynone or fmopenreadwrite در دلفی به عنوان پارامتر دوم و تووصیه نمی کنم فایل رو مستقیم باز کنی... پوینتر محترم فایل یا حالا استریم هرچی که که هست باید گلوبال باشه.
2- نیاز نیست فایل رو تو آخر ببندی.
فایل تو برنامه دوم هم مثل شیر کار می کنه!
سایز رو چک کن و آخرین سایزی رو که ایمپورت کردی و یا تو فایل دستکاری کردی توی یک فایل معمولی ذخیره کن.

چرا از ایونتها استفاده نکنیم؟ ببین... این ایونتها در زمانی که فایل باز و بسته شده عملا کار می کنند و ثانیا حتی در صورت تغییر مثلا هر چند لحظه یکبار یک تغییر میاد... فایلهای تکست معمولا بافر می شوند و ممکن هست تو اصلا فیلد توی تکستت کامل نشده باشه پس صحیح نیست که کاری بکنی... من توصیه می کنم این کار رو به راحتی :‌ یعنی گذاشتن یک تایمیر و چک کردن اندازه فایل انجام بدی... هر 10 دقیقه... چون فایلت همیشه باز هست مشکل نداری برنامه دومی مثلا فایل رو اپن کنه ولی باید برنامه تو قبل اون ران بشه (کلک مرغابی!)
خوب... می تونی چک بکنی که مثلا برنامه دوم اطلاعات رو توی فایل کامل نوشته و تو می تونی شروع کنی از جایی که قبلا بودی به ورود اطلاعات توی فایل؟‌ می تونی مقادیر اسکی 10 و 13 که به ترتیب نشونه شکستن خط هست (عمومیه) و یا یه جور دی لیمیتر رو نشون کنی که شروع کنی به خوندن ...
من خوندن یک جا توی پوینتر رو بهت توصیه می کنم به این صورت که یک پوینتر 64000 کیلیوبایتی بگیری اندازه رو یه جا نگه داری ممکنه 500 بایت ورودی داشته باشی مثلا بعد همه رو مستقیم توی اون بخونی و شروع به غیاث کنی... جایی که به عنوان آخرین مکان ورودی میگیری (توی دات نت به این صورت نمیشه کمی باید با تایپها و تغییرات میشه گفت جزیی اون آشنا بشی)‌ باید + تعداد بایتی که خوندی بشه! خط رو با غیاث دوتا دوتا با 10 و 13 می تونی بفهمی... (توی یک بایت پوینتر و یا آبجکت بایت در دات نت چه سی شارپ یا دلفی)‌ 32 بیت باید از پی بایت آرری استفاده کنی یعنی اونرو به پوینترت پوینت کنی.

حالا یه کیس دیگه پیش میاد : آقا 64 کیلوبایت کمه! مثلا 2 مگه؟‌ خوب این کاری نداره! تو باید یه لوپ بندازی (ببین مقدار سایز فایل رو قبل ورود به حلقه سیو کن لطفا!)‌ آخریش خورده هاشو با (-FILESIZE - POSITION) mod BUFFERSIZE به دست میاری ... یعنی فکر نکن همچینم کار ساده ایه یه خورده باید کد بنویسی... :))‌ اگر سوالی داشتید در خدمتم بنده در مسافرت هستم کمی درگیرم ...


چرا نباید از ایونت ها استفاده کنی؟‌
چون وابسته به بستن و باز کردن فایل هستند و در عین حال تغیرات رو به صورت آنی اطلاغ ممکنه ندن ممکنه سرور کام مربوطه کما باشه! مثلا به هر دلیل... :))‌ ویندوزه!‌ ثانیا ...روش درستی نیست! همینی که گفتم یه تایمر و یه سری مقایسه نه چندان پیچیده کار رو حل می کنه! ولی توابع خاص این موضوع در دات نت و شل وجود دارند و من یادمه جم سافتویر یه سری کامپوننتهای توپ آماده کرده واسه اینکارا (با آقای کرامتی تماس یگیر من دارم ولی نمی تونم اینجا بگذارم چون مال شرکت هستش )‌

چرا باید فایلرو قبل اینجوری باز کنی و چرا برنامه ات باید قبل اون باز بشه ؟
باید فایلرو باز کنی چون برنامه دوم ممکنه فایل رو باز نگه داره اولا! و اشتراک نگذاره اونوقت برنامه تو از کجای فایل می خونه؟‌ لوی اگر برنامه تو اول ران بشه بعد اون برنامه تو دسترسیشو حفظ می کنه و چون فایل اشتراک گذاری شده برنامه دوم هم کار خودشو می کنه! :))

جاتون خالی من چند سال پیش یه اکونتینگ برای سیستم ویپ نوشتم که جک بود!‌چون سخت افزارش سیسکو نبود و نرم افزارش هم قدیمی ! در هر وضعیت چاره ای نبود... :))‌

این کار کار استانداردی نیست پس فکر نکن مایکروسافت میاد یه تابع خاص و دقیق می گذاره... توابع مایکروسافت روی باز و بستن فایل حساسند و در عین حال تو نیاز به چک لحظه به لحظه نداری... هر 10 دقیقه... 20 دفیقه یک چکی بکن.

اینا توی لینوکس و دات نت و لدفی معمولی یه جور کار می کنه! چون چیز کم کاربردیه ا این بهتر نمیشه! شرمنده! فرامین شل باعث می شوند که تو وقتتو تلف کنی چون کاربردشون برای کارهای این مدلی نیست (ورودی از یه فایل تکست تو یه برنامه دوم که هی تغییر می کنه و چیزی هم در موردش نمی دونی‌)‌

Touska
دوشنبه 16 خرداد 1384, 18:00 عصر
ولی اگر بتونید مثالی بتونم از آن استفاده کنم بزارید ممنون می شوم و گرنه ممنونم.

موفق باشید :flower: