PDA

View Full Version : گفتگو: استفاده از system.io.fileInfo یا API



احمد سامعی
دوشنبه 12 مهر 1389, 10:53 صبح
سلام

برای دریافت اطلاعات فایل ها و فولدرها در یک مسیر خاص کدام روش بهینه وسریعتر هست، استفاده از کلاس System.IO.FileInfo یا توابع API

لطفاً راهنمایی کنید و این که چطوری از برای اینکار از توابع API استفاده کنم

Mohandes2009
دوشنبه 12 مهر 1389, 11:19 صبح
http://barnamenevis.org/forum/showpost.php?p=483049

احمد سامعی
دوشنبه 12 مهر 1389, 11:33 صبح
ممنون عزیز اما سوال اصلی من هنوز سرجاش هست کدام روش بهتر و سرعت عمل بالاتری داره

MSN_Issue
دوشنبه 12 مهر 1389, 11:58 صبح
اگه اندکی با دلفی آشنایی داشته باشید میتونید از این تاپیک (http://barnamenevis.org/forum/showthread.php?t=224310&page=2) استفاده کنید ...

mehdi.mousavi
دوشنبه 12 مهر 1389, 12:12 عصر
سلام برای دریافت اطلاعات فایل ها و فولدرها در یک مسیر خاص کدام روش بهینه وسریعتر هست، استفاده از کلاس System.IO.FileInfo یا توابع API لطفاً راهنمایی کنید و این که چطوری از برای اینکار از توابع API استفاده کنم

سلام.
ببینید. شما وقتی باید برید سراغ Win32 API ها که BCL ساز و کاری براش نداشته باشه یا کاری که میخواهید انجام بدید Performance Critical باشه (که در اینصورت این سوال پیش میاد که چرا اصلا کد Managed باید بنویسیم؟).

اما در سوال شما یه نکته ای نهفته هستش، اونم Enumerate کردن فایلهای داخل یک Folder. تا قبل از .NET 4.0 شما باید از System.IO.Directory.GetFiles استفاده میکردید. این متود، به شما آرایه ای از string برمیگردوند و به گونه ای پیاده سازی شده بود که اگر شما نیاز به گرفتن چند فایل از خروارها فایل در اون Directory رو داشتید، باز هم مجبور بودید صبر کنید تا کلیه فایلها توسط این متود Enumerate بشه.

خوشبختانه در .NET 4.0 با معرفی متود EnumerateFiles (http://msdn.microsoft.com/en-us/library/dd383458.aspx) این مشکل رفع شده. اما اگر شما از .NET 4.0 استفاده نمیکنید، میتونید به مقاله ای که Tom Shelton نوشته (http://tom-shelton.net/index.php/2010/01/02/using-extension-methods-and-the-win32-api-to-efficiently-enumerate-the-file-system/) مراجعه کنید و همینکارو در .NET های نسخه قبلی بکمک Win32 API ها انجام بدید (البته اگر شرایط اجرایی شما چنین چیزی رو طلب میکنه، و الا اگر نیاز دارید کلیه فایلهای درون Folder رو بگیرید، استفاده از همون GetFiles کفایت میکنه).

جمع بندی: اگر نقصانی در BCL هستش یا چیزی در BCL بد پیاده سازی شده، اونوقت سراغ Win32 API ها رفتن معنا پیدا میکنه. در غیر اینصورت، اولویت اول استفاده از BCL باید باشه.

موفق باشید.

احمد سامعی
سه شنبه 13 مهر 1389, 17:02 عصر
سلام
ممنون استاد موسوی
برنامه من کار با عکس هست و برای عکاسان نوشته می شه . برنالمه تغییر سایز عکس به صورت گروهی هست. البته احتمال اینکه که یک عکاس فایلی غیر عکس قاطی عکس هاش کنه اون هم به تعداد زیاد بعید هست چون خودم هم عکاسم در نتیجه فقط می مونه فیلتر کردن فرمت های مختلف که قطعاً استفاده از GetFiles چون خودش می تونه فیلتر هم بکنه بهتر به نظر می رسه
در ضمن من از Net 4 یا همون VS 2010 استفاده می کنم مشکلی ندارم که به خوام از EnumerateFiles استفاده کنم اما چون تازه یک هفته 2010 نصب کردم خیلی از امکانات جدید نمی دونم باید بیشتر مطالعه کنم و در رابطه با EnumerateFiles هم بخونم که چطوری کار می کنه این توضیحات دادم تا شما راهنمایی کنید
من توضیحات لینک اول شما در MSDN خوندم به نظرم باید از همون EnumerateFiles استفاده کنم
چون من یک کنترل Browser دارم که مشابه سازی windows Explorer هست که برای دریافت اطلاعات از API استفاده کرده و سرعت خوبی داره

و اما لینک دوم باز نشد کل سایتش در دسترس نیست

یک سوال فرعی: آیا برای دریافت اطلاعات اضافی فایل عکس در Net 4 هم باید از خاصیت PropertyItem کلاس Image استفاده کنم چون کار باهاش خیلی سخت

ممنون