View Full Version : گفتگو: سورس یک برنامه ی File Shredder، لطفا بررسی کنید
clover
دوشنبه 03 خرداد 1389, 02:39 صبح
با سلام
سورس زیر به همراه فایل اجرایی، حاصل تلاش چند روزه ی من برای ساخت یک برنامه ی File Shredder (حذف فایل به شیوه ی غیر قابل بازگشت) ساده به شیوه ی Win32 هست.
برنامه را در ویندوز XP و بر روی فایل های یک درایو با فرمت NTFS آزمایش کردم و برنامه ی Recover My File موفق به بازیابی فایل ها نشد. با این حال با توجه به اطلاعات و تجربه ی کمی که از برنامه نویسی به شیوه ی Win32 دارم، از شما خواهش می کنم کمی وقت بگذارید و سورس را بررسی کنید و ایراداتی که هست را به من بگید.
نکته ی دیگه اینکه، در حالی که عملیات حذف فایل در یک ترد مجزا انجام می گیره چطور می تونم در هر لحظه از وضعیت عملیات حذف مطلع بشم و تغییرات را در یک Progress bar و یا یک Status bar نمایش بدم ؟
پیشاپیش از شما متشکرم
clover
دوشنبه 10 خرداد 1389, 19:26 عصر
ممنون از این همه لطفی که کردید و این همه پاسخی که دادید :لبخند:
به هر حال، متوجه شدم که برنامه قبلی سر تا پا ایراد و اشکال است. به همین دلیل یه نسخه دیگه قرار میدم که نسبت به کد قبلی تا حدودی مرتب تر و اصولی تر هست.
تغییرات :
1- اضافه کردن Error Handling با استفاده ار بلوک های try - catch
2- استفاده از بافر رایت بزرگتر برای افزایش سرعت
3- مرتب سازی کد
سوالات:
1- آیا نحوه Error Handling صحیح هست ؟
2- چطور می تونم از داخل یک thread، وضعیت را هر لحظه اعلام کنم تا در progress control موجود در دیالوگ نمایش داده شود ؟
آیا باید هندل دیالوگ را به thread بدم تا مستقیما کنترل کند ؟ یا باید یک پیغام ارسال کنم ؟ قابلیت استفاده مجدد را هم در نظر بگیرید
در ضمن قصد من یادگیری روش اصولی ساختن یه برنامه به شیوه ی Win32 هست. طوری که بشه راحت توسعه داد. مدیریت خطا کرد و ... نمونه ی کد دیدم اما به محض اینکه خودم شروع به نوشتن می کنم به سوالات زیادی برخورد می کنم و کدی که در حال نوشتنش هستم به سرعت به سمت آشفتگی میره.
hoax3r
سه شنبه 11 خرداد 1389, 16:56 عصر
سورست نسبت به قبلی خیلی بهتر شده، :لبخندساده: ،
1- آیا نحوه Error Handling صحیح هست ؟
وقتی دستورات throw اجرا میشه و کنترل برنامه به catch میاد قاعدتا باید یه پیام نمایش داده بشه
catch(LPCWSTR ex)
{
// show message
}
- چطور می تونم از داخل یک thread، وضعیت را هر لحظه اعلام کنم تا در progress bar موجود در دیالوگ نمایش داده شود ؟
آیا باید هندل دیالوگ را به thread بدم تا مستقیما کنترل کند ؟ یا باید یک پیغام ارسال کنم ؟ قابلیت استفاده مجدد را هم در نظر بگیرید
همونطور که گفتین به همون thread هندل دایلوگ رو بدین بعد داخل حلقه ای که بلاک حافظه رو روی فایل می نویسه یه واحد به progress bar اضافه کنید. برای استفاده از این کنترل یه راه می تونه این باشه که شما با استفاده از پیامPBM_SETRANGE32 رنج progress bar رو به اندازه شمارنده حلقه بگیرین بعد از پیام های PBM_SETSTEP و PBM_STEPIT برای افزایش progress bar استفاده کنید
یه پیشنهاد هم دارم بلاک حافظه رو بزرگتر در نظر بگیرین مثلا 0x2000 بایت سرعت برنامه رو خیلی بالا میبره
در ضمن قصد من یادگیری روش اصولی ساختن یه برنامه به شیوه ی Win32 هست. طوری که بشه راحت توسعه داد. مدیریت خطا کرد و ... نمونه ی کد دیدم اما به محض اینکه خودم شروع به نوشتن می کنم به سوالات زیادی برخورد می کنم و کدی که در حال نوشتنش هستم به سرعت به سمت آشفتگی میره.
این سوال شما یجورایی سوال خوده منم هست، اگر کسی بتونه به این سوال پاسخ بده خیلی خوب می شه
نمی دونم این چیزی هست که باید با تجربه بدست بیاد یا اصول خاصی داره، فعلا ما فقط با تقسیم در چند فایل
و محدود کردن حوزه داده ها این مشکل رو در پروژه های کوچیک کمی بهتر کردیم ولی پروژه های بزرگتر ....
clover
سه شنبه 11 خرداد 1389, 19:44 عصر
دوست عزیز hoax3r (http://www.barnamenevis.org/forum/member.php?u=47718)، واقعا ممنون از پاسخی که دادید
وقتی دستورات throw اجرا میشه و کنترل برنامه به catch میاد قاعدتا باید یه پیام نمایش داده بشه
من داخل C# هم همین سوال را دارم.
پیغام باید در آخرین مرحله و توسط مشتری یک تابع نمایش داده بشه یا داخل خود تابع ؟
فرض کنید مشتری، یک تابع را فراخوانی میکنه و اون تابع هم چندین تابع دیگه را در طول عملیات داخلی خودش فراخوانی میکنه.
آیا روش صحیح این هست که هر تابع exception های تولید شده را به تابع بالاتر پاس بده تا به دست مشتری برسه و اون تصمیم بگیره که چکار کنه (مثلا یک پیغام تولید کنه یا در یک لاگ فایل بنویسه یا ...) و یا اینکه در هر جا به خطا بر خوردیم باید فورا یک پیغام نمایش بدیم ؟
آیا تولید exception ها سربار داره ؟
همونطور که گفتین به همون thread هندل دایلوگ رو بدین بعد داخل حلقه ای که بلاک حافظه رو روی فایل می نویسه یه واحد به progress bar اضافه کنید. برای استفاده از این کنترل یه راه می تونه این باشه که شما با استفاده از پیامPBM_SETRANGE32 رنج progress bar رو به اندازه شمارنده حلقه بگیرین بعد از پیام های PBM_SETSTEP و PBM_STEPIT برای افزایش progress bar استفاده کنید
این مورد هم مثل مورد قبلی. شاید مشتری ما بخواد به جای استفاده از یک progress از یک status bar استفاده کنه و یا حتی بخواد در محیط کنسولی از این تابع استفاده کنه. اون موقع چی ؟ آیا روشی هست که بشه فقط وضعیت را گزارش داد ؟
مثلا با ثبت یک پیغام اختیاری برای گزارش وضعیت عملیات. آیا این کار اصولی هست ؟
hoax3r
چهارشنبه 12 خرداد 1389, 14:32 عصر
پیغام باید در آخرین مرحله و توسط مشتری یک تابع نمایش داده بشه یا داخل خود تابع ؟
فرض کنید مشتری، یک تابع را فراخوانی میکنه و اون تابع هم چندین تابع دیگه را در طول عملیات داخلی خودش فراخوانی میکنه.
آیا روش صحیح این هست که هر تابع exception های تولید شده را به تابع بالاتر پاس بده تا به دست مشتری برسه و اون تصمیم بگیره که چکار کنه (مثلا یک پیغام تولید کنه یا در یک لاگ فایل بنویسه یا ...) و یا اینکه در هر جا به خطا بر خوردیم باید فورا یک پیغام نمایش بدیم ؟
اول اینکه من اون قسمت از کدتون که پیام رو نمایش میدادین ندیده بودم داخل فایل اصلی، در نتیجه گفتم باید پیامی ظاهر بشه
ولی در مورد سوالتون به نظرم این بیشتر سلیقه ای هست تا یک سری اصول ثابت که حالا من بگم حتما اینطور باشه، به اون صورت که شما استفاده کردین هم درسته
این موراد بیشتر بستگی به نیازتونه که آیا لازمه که همون موقع پیامی ظاهر بشه؟ یا فقط یکسری کارا بشه ولی پیام در exception handler قبلتر نمایش داده بشه
ولی من به هر دو صورت رو دیدم استفاده بشه
آیا تولید exception ها سربار داره ؟
درست متوجه منظورتون نشدم
این مورد هم مثل مورد قبلی. شاید مشتری ما بخواد به جای استفاده از یک progress از یک status bar استفاده کنه و یا حتی بخواد در محیط کنسولی از این تابع استفاده کنه. اون موقع چی ؟ آیا روشی هست که بشه فقط وضعیت را گزارش داد ؟
مثلا با ثبت یک پیغام اختیاری برای گزارش وضعیت عملیات. آیا این کار اصولی هست ؟
بیشتر مشکل شما اصول برنامه نویسی هست تا مشکل که خودم منم با این قضیه مشکل دارم یعنی همین که برنامه برام کار کنه کافیه:لبخندساده:
و در مورد اینکه قسمت ارتباط با اینترفیس رو مجزا کنیم، امکانش هست یه راه این میتونه باشه که یکسری متغییر عمومی تعریف کنید
بعد در حین انجام عملیات این متغییر بر اساس روند کارتون تغییر کنه و مثلا یه thread دیگه ایجاد کنید که اینو بخونه و در progress bar نشون بده،
البته باید توجه کنید که چون دو تا thread به یه متغییر بصورت مشترک دسترسی دارن باید از روشهای همزمان سازی استفاده کنید که مشکلی پیش نیاد مثللا از استفاده از توابع Interlocked
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.