PDA

View Full Version : سئوالي در مورد فايل‌ها



Rambod
پنج شنبه 09 خرداد 1387, 08:49 صبح
سلام.
من در حال نوشتن يك پروژه هستم كه در اين پروژه يك سرور وجود داره و چندين كلاينت. در قسمت سرور يك فولدر وجود داره كه يك سري فايل ويدئويي توسط اپراتور توي اين فولدر كپي ميشه. تمام كلاينت‌ها بايد طبق يك Interval اين فولدر رو چك بكنند كه در صورت تغيير، خودشون رو با اين فولدر Synch بكنند و تمام فايلهاي جديد رو براي خودشون و توي فولدر خودشون كپي كنند و فايلهاي حذف شده را هم از فولدر خودشون حذف بكنند.
حالا اينجا يه مشكلي وجود داره و اونم اينه كه همون لحظه كه اپراتور داره فايل رو در سرور و در اون فولدر خاص كپي ميكنه، همون لحظه يك كلاينت Intervalش سر ميرسه و بايد سرور رو چك بكنه. به همين خاطر ليست فايلهاي موجود رو ميگيره و شروع ميكنه به كپي كردن فايلها. اما غافل از اينكه درسته فايلي به نام x وجود داره اما اين فايل هنوز كامل توسط اپراتور كپي نشده و در حال كپي شدن هست. و به همين دليل خطا رخ ميده و نميتونه فايل رو كپي كنه.
به نظر شما كلاينت چجوري ميتونه بفهمه كه فايل x قابل كپي شدن هست يا نه؟!

amirsajjadi
پنج شنبه 09 خرداد 1387, 13:47 عصر
با سلام
شما میتونی یک فایل توی پوشه قرار بدید ؛ وقتی که هر سیستمی در حال تغییر فایل های اون پوشه بود داخل این فایل رو یک مقدار (مثلا LOCK) بنویسه . سیستمی که میخواد به فایلها دستیابی داشته باشه اول باید مقدار درون این فایل رو چک کنه مثلا اگه مقدار برابر Unlock بود آنوقت میتونه به فایلها دستیابی داشته باشه
در واقع برای فایل های داخل پوشه یک قفل نرم افزاری ساخته میشه

Rambod
پنج شنبه 09 خرداد 1387, 14:08 عصر
از جوابتون متشكرم ولي هيچ كدوم از كلاينت‌ها توي فولدر سرور چيزي نمي‌ريزند. دسترسي هم فقط ReadOnly هستش و فقط حق خوندن رو دارند. فقط فايلها رو ميخونند اگر فايل خونده شده رو قبلاً توي كامپيوتر لوكال كپي كرده بودند كه هيچي اما اگر فايل خونده شده جديد بود و قبلاً تو كامپيوتر لوكال كپيش نكرده بود، اون رو كپي مي‌كنه روي كامپيوتر لوكال (كلاينت).
مشكل وقتي بوجود مياد كه اپراتور يك فايل جديد در فولدر سرور ميذاره. فرض كنيد يك فايل 100 مگابايتي كه كپي كردن اون طبعاً طول ميكشه. وقتي كلاينت دستور خوندن فايلهاي سرور رو ميده، اين فايل جديد كه هنوز عمليات كپي كردنش تموم نشده هم جزو مقادير برگشتيه. در ضمن من از دستور My.Computer.FileSystem.GetFiles استفاده مي‌كنم.
درسته كه اسم فايل جزو فايلهاي موجوده ولي هنوز عمليات كپي تموم نشده و وقتي كلاينت شروع ميكنه به كپي اين فايل، با خطا مواجه ميشه.

shahrdar
شنبه 11 خرداد 1387, 02:15 صبح
به نظر من خيلی سادست.

1- يک BOOLEAN بساز مثلاً بنام NowUpdating
2- مقدارشو بزار False
3- روی server يه دکمه بساز به نام Update که وقتی فشارش ميدی nowupdating رو برابر True کنه
4-حالا وقتی کلينت وصل شد و nowupdating = True به کلينت پيغامی بده هميه اين که سرور داره آپديت ميشه

به همين سادگی :)

Sub Zero
شنبه 11 خرداد 1387, 08:51 صبح
عکس جوابی که Shahrdar گفت هم امکان پذیره . اگه از Socket Programing استفاده میکنید قبل از تغییر فایل توسط سرور یه پکت رو به صورت BroadCast برای تمامی کلاینتها ارسال کنید مبنی بر اینکه سرور در حال تغییره فایله . میتونید سمت کلاینت متغییری رو برای این کار تعریف کنید و هر بار سرور این پکت رو ارسال کرد اونو True یا False کنید .

Rambod
شنبه 11 خرداد 1387, 20:00 عصر
نه اصلاً هيچ سوكتي در كار نيست. منظورم از سرور يك كامپيوتره كه فقط فايلهاي ويدئويي توش قرار داده ميشه و هيچ نرم‌افزاري هم اونجا نصب نيست. كار اصلي رو كلاينت‌ها انجام ميدن كه فايلها رو از سرور كپي ميكنند تو كامپيوتر لوكال.