PDA

View Full Version : سوال: عملكرد عجيب FileCopy



Rambod
شنبه 02 شهریور 1387, 13:32 عصر
سلام
من يه برنامه دارم كه بايد از طريق شبكه داخلي، يك فايل رو از روي يك كامپيوتر ديگه كپي كنه تو كامپيوتر لوكال. براي اين كار، اول كامپيوتر منبع رو پينگ مي‌كنم و اگر جوابي اومد، اونوقت از طريق My.Computer.FileSystem.CopyFile عمليات انتقال فايل رو انجام ميدم.
همه چيز به خوبي كار ميكنه. اما گاهي وقت‌ها، نمي‌دونم چه اتفاقي مي‌افته، فايل رو منتقل ميكنه. ولي فايل رو خراب ميكنه. حتي سايزش هم با سايز فايل اصلي يكي هست. ولي محتوياتش از يك جايي به بعد خراب ميشه.
توي برنامه هم، كاملاً Error Handling رو رعايت كردم و دستور بالا رو توي Try Catch گذاشتم و اگر در حين عمليات كپي، خطايي رخ بده، اعلام ميكنه.

لازم به ذكر هستش كه اين برنامه روي 12 تا كامپيوتر نصبه و با Interval برابر 30 ثانيه سرور رو چك مي‌كنند تا اگر فايلي براي كپي كردن موجود باشه، اون فايل رو كپي كنند.
اين مشكل ديوونم كرده! به اين فكر افتادم كه خودم يه ماژول كپي فايل بنويسم و بايت به بايت فايل رو منتقل كنم و در صورت خطا، گزارش بدم!!

__H2__
شنبه 02 شهریور 1387, 20:47 عصر
سلام
اصلاً برای چی این کار را میکنید؟؟؟ خدایی ناکرده، بلا به دور(!!!!) این کار را که برای انتقال اطلاعات و شبکه ای کردن برنامه که انجام نمیدهید؟؟؟ و وسیلهای برای انتقال اطلاعات بین برنامه هایتان که نیست؟؟؟

Rambod
شنبه 02 شهریور 1387, 21:56 عصر
راستش توضيحش سخته. تابلوهاي ديجيتال LED رو ديديد كه؟ توي محوطه شركت ما حدود 11 تا از اين تابلوها هست. هر كدوم از اين تابلوها يه PC دارند. من وظيفه نوشتن برنامه‌اي رو داشتم كه اپراتور فقط فايلهاي ويدئويي مورد نظرش رو در يك فولدر در File Server كپي بكنه، و تابلوها اتوماتيك به سرور وصل بشن و فايلهاي ويدئويي رو توي كامپيوتر خودشون كپي كنند (يا به اصطلاح سنكرون بكنند) و شروع به پخش آنها بكنند. همه چيز درست كار ميكنه. فقط گاهي اوقات فايل‌ها خراب به مقصد ميرسه و باعث ميشه كه كامپوننت Windows Media Player نتونه فايل خراب رو پخش بكنه و هنگ بكنه و برنامه Error بده.
حالا فعلاً تا جواب اين مشكل من پيدا بشه، خودم يه ماژول كپي فايل نوشتم كه فايلها رو با بافر يك كيلوبايت، منتقل ميكنه. فعلاً تستي گذاشتم روي دو تا از تابلوها تا ببينم به مشكل ميخوره يا نه...

__H2__
یک شنبه 03 شهریور 1387, 06:59 صبح
سلام،
در کل چیزی که میخواستم بگویم ان بود که استاندارد انتقال اطلاعات در شبکه ها برنامه نویسی سوکت است نه انتقال فایل.

ولی چون قصد شما خود فایل است و در مقد برنامه تان قرار نیست فایل را دوباره باز کند و بخواند.
هم میتوانید از سوکت استفاده کنید و هم شاید در این مورد خاص IIS هم بد نباشد.
یعنی در سرور شبکه تان مثلاً یک وب سرویس جهت اطلاع از آخرین اپدیت ها قرار دهید و فایل را برای دانلود قرار دهید. (شبیه اینترنت)

به نظرم، شاید این برنامه اصولی تر از دسترسی مستقیم به درایوهای Share شده باشد.

باید به این هم دقت کنید که تا زمانی که در سرور فایل به مکان جدید کپی نشده، اگر کلاینتها اقدام کنند، شاید یک فایل ناقص را بخوانند.

ولی با استفاده اگر مکانیزمی (مثل همان وب سرویس) برای اطلاعات آخرین نسخه و آپدیت، داشته باشید. میتوانید بعد که همه چیز حاضر شد و آماده دانلود یا کپی است، خبر این نسخه جدید را قرار دهید تا کلاینت ها دانلود یا کپی را شروع کنند.
=====
البته همچنان استفاده از سوکت بهترین گزینه است، چون دیگری نیاز به چک کردن تایمیک هم نیست.
و سرور میتواند هر زمان فایل جدید موجود بود به کلاینت اطلاع دهد و دیتا و فایل جدید را تحویل دهد.

Rambod
یک شنبه 03 شهریور 1387, 09:08 صبح
سلام،
باید به این هم دقت کنید که تا زمانی که در سرور فایل به مکان جدید کپی نشده، اگر کلاینتها اقدام کنند، شاید یک فایل ناقص را بخوانند.

قبل از اينكه اقدام به كپي كردن فايل بكنم، اول Lenght آنرا ميگيرم. اگر فايل هنوز كامل كپي نشده باشد، طول آن برابر صفر است. در نتيجه اصلاً كاري با اين فايل ندارم.



البته همچنان استفاده از سوکت بهترین گزینه است، چون دیگری نیاز به چک کردن تایمیک هم نیست.
و سرور میتواند هر زمان فایل جدید موجود بود به کلاینت اطلاع دهد و دیتا و فایل جدید را تحویل دهد.

كاملاً درست مي‌فرمائيد. ولي سوكت‌ها هم دردسر خاص خودشون رو دارند. من قبلاً با VB 6.0 يك برنامه چت روم كامل با سوكت‌ها نوشتم و ميدونم چه ريزه‌كاري‌هايي داره.

__H2__
یک شنبه 03 شهریور 1387, 12:59 عصر
سلام

.. و ميدونم چه ريزه‌كاري‌هايي داره..
شاید درست باشه، ولی زیاد هم سخت نیست، مخصوصاً در دات نت،
اگر خواستید میتوانید سری به دو تاپیک کوچک زیر هم بزنید، دو مثال خیلی خیلی ساده و ابتدایی ابتدایی از برنامه نویسی سوکت در VB.Net هم پیدا خواهید کرد.
که شاید بدردتان بخورد و سر فرصت بتوانید ارتقایی به برنامه تان بدهید و برایتان یک دوستی مجددی باشد با سوکت ها در VB جدید! (چون به نظر من که از VB6 ساده تر شده.)
barnamenevis.org/forum/showthread.php?t=113361
barnamenevis.org/forum/showthread.php?t=118051&page=3

موفق باشید.

Rambod
سه شنبه 05 شهریور 1387, 16:04 عصر
دوستان عزيز، مشكل من با استفاده از ماژول كپي فايل كه توسط خودم نوشته شده بود حل شد. يعني ديگه از FileCopy خود DotNet استفاده نميكنم. و فكر ميكنم مشكل حل شده. چون فايلها ديگه خراب به مقصد نمي‌رسند.

ولي اگر علت خراب شدن فايل هنگام استفاده از FileCopy روشن ميشد واسه اطلاعات عمومي خوب بود!

Rambod
یک شنبه 28 مهر 1387, 13:16 عصر
دوستان با روش جديد هم امكان خطا هست. هر چند خيلي كم اتفاق مي‌افته. ولي همون مقدار هم نبايد اتفاق بيفته!
كسي نظري نداره؟ چجوري از صحت كپي فايل مطمئن بشم؟