حذف کردن فایل در کل یک درایو در #c و به کمک api ویندوز

Rainmater

Member
سلام
چه جوری میشه با توابه API برنامه ای نوشت که توی اون نام درایو و نام فایل رو از کاربر بگیره
و در داخل اون درایو هر فایلی با اون نام داشتیم حذف کنه؟
مثلا اگه کاربر *.txt رو وارد کرد تمام فایل های با پسوند txt اون درایو (شامل ساب فولدر ها) رو پیدا کنه و پاک کنه؟
 

the_king

مدیرکل انجمن
سلام
چه جوری میشه با توابه API برنامه ای نوشت که توی اون نام درایو و نام فایل رو از کاربر بگیره
و در داخل اون درایو هر فایلی با اون نام داشتیم حذف کنه؟
مثلا اگه کاربر *.txt رو وارد کرد تمام فایل های با پسوند txt اون درایو (شامل ساب فولدر ها) رو پیدا کنه و پاک کنه؟

با کدوم زبان برنامه نویسی؟ با #C یا زبان دیگه ای؟ زبان های تحت Net. با وجود Framework در اغلب موارد نیازی به
ارتباط مستقیم با API سیستم عامل ندارند. API ویندوز برای حذف کردن مجموعه ای از فایل ها تابع SHFileOperation
رو داره.
 

Rainmater

Member
بله منظورم با c sharp بود .
و میخوام اون مثالی که گفتم رو با توابع api پیاده سازی کنم؟
با تشکر فراوااااااااان از شما
 

the_king

مدیرکل انجمن
کاری که خیلی ساده تر با Framework میشد انجام داد رو با API ویندوز پیاده سازی کردم.

کلاس SearchFiles.cs برای جستجوی فایل ها در یک مسیر و زیر پوشه هاش بکار میره، یک
تابع به اسم ()FindFilesRecursively رو ارائه می کنه که تمامی فایل هایی که با pattern
مورد نظر شما مطابقت داره رو بصورت آرایه string بر می گردونه.
داخل این کلاس از توابع API جستجوی فایل یعنی FindFirstFile و FindNextFile و FindClose استفاده شده.
کل عملکرد این کلاس رو می توانستید خیلی ساده تر با تابع Directory.GetFiles موجود در Framework انجام دهید.

کلاس DeleteFiles.cs برای حذف کردن لیستی از فایل ها بکار میره. در داخل این کلاس دو تابع به
اسم های ()DeleteFilesProgress و ()DeleteFilesSilent ارائه میشه که می توانند یک آرایه string
شامل مسیر فایل ها رو دریافت کرده و حذف کنند. فرقشان با هم در این است که دومی هیچگونه
نمایشی ندارد اما اولی موقع حذف کردن فایل ها در یک پنجره جداگانه اسمشان و یک Progressbar
را نمایش می دهد.

ابتدا عملیات جستجو بایستی خاتمه یابد و سپس عملیات حذف کردن آغاز می گردد. این دو عملیات در
یک نخ (Thread) جداگانه و توسط backgroundWorker1 انجام می شوند تا برنامه اصلی و فرم برنامه در
هنگام انجام این عملیات سنگین قفل نکند، یعنی عملیات بصورت Multi-threading انجام می شود.

کد کامل برنامه (Visual Studio 2008) به همراه فایل اجرایی exe ضمیمه این پست می باشد.
 

پیوست ها

  • RecursiveDeleteFilesAPI.zip
    45.8 کیلوبایت · بازدیدها: 19

Rainmater

Member
ممنون از شما که پاسخگوی سوال ها هستید،واقعا ممنون
میتونیم برای پاک کردن از تابع delete file موجود در kernel32.dll استفاده کنیم؟
یا حتی کل عملیات جستجو توسط توابع FindFirstFile و FindNextFile انجام بدیم(بدون استفاده از FindFilesRecursively )؟
 

the_king

مدیرکل انجمن
ممنون از شما که پاسخگوی سوال ها هستید،واقعا ممنون
میتونیم برای پاک کردن از تابع delete file موجود در kernel32.dll استفاده کنیم؟
یا حتی کل عملیات جستجو توسط توابع FindFirstFile و FindNextFile انجام بدیم(بدون استفاده از FindFilesRecursively )؟
می توانید از DeleteFile استفاده کنید اما DeleteFile فقط یک فایل رو در هر عملیات حذف می کنه. برای حذف کردن
تعداد زیادی فایل کمی کنده و مناسب نیست. از اونجایی که قبل از عملیات جستجو تعداد فایل هایی که در انتها
پیدا خواهند شد مشخص نیست از یک ProgressBar مشخص که با درصد پیشرفت عملیات رو نشون بده نمیشه
استفاده کرد. در نتیجه استفاده از DeleteFile جز کند شدن عملیات کمک خاصی نمی کنه، مگر اینکه بخواهید
برای حذف کردن تک تک فایل ها یک حلقه بسازید تا هر زمانی که خواستید عملیات حذف شدن رو متوقف کنید.

یا حتی کل عملیات جستجو توسط توابع FindFirstFile و FindNextFile انجام بدیم(بدون استفاده از FindFilesRecursively )؟

من هم در داخل FindFilesRecursively از FindFirstFile و FindNextFile استفاده کردم اما این نکته رو در نظر بگیرید که
FindFirstFile و FindNextFile به تنهایی فقط پوشه ها و فایل های فرزند یک مسیر رو پیدا می کنند و وارد زیر پوشه ها
نمی شوند. به همین جهت اگر برای استفاده از آنها تابع جدیدی نسازید نمی توانید زیر پوشه ها رو به روش بازگشتی
پیمایش و جستجو کنید. فرضا اگه مسیر C:\New Folder رو پیمایش کنید دیگه مسیر C:\New Folder\My Files نمیشه
و فایل های داخل اون رو جستجو نمی کنه. ناچار هستید که تابعی مثل FindFilesRecursively رو بسازید تا به روش
بازگشتی فراخوانی اش کنید.
 

جدیدترین ارسال ها

بالا