سلام و وقت بخیر دوستان چطوری عکسهایی که داخل یک پوشه در یکی از درایوهای سیستم ذخیره شده را داخل گریدویو نمایش بدهم با تشکر و سپاس
سلام و وقت بخیر دوستان چطوری عکسهایی که داخل یک پوشه در یکی از درایوهای سیستم ذخیره شده را داخل گریدویو نمایش بدهم با تشکر و سپاس
// مسیر پوشه حاوی تصاویر
string folderPath = @"C:\MyImagesFolder";
// لیستی از فایلهای موجود در پوشه
List<string> imageFiles = Directory.GetFiles(folderPath).ToList();
// ساخت دیتاسورس گریدویو
DataTable dataTable = new DataTable();
dataTable.Columns.Add("Image", typeof(Image));
// برای هر فایل تصویری در لیست، تصویر را بخوانید و به دیتاتیبل اضافه کنید
foreach (string imagePath in imageFiles)
{
Image image = Image.FromFile(imagePath);
dataTable.Rows.Add(image);
}
// ست کردن دیتاتیبل به گریدویو
dataGridView1.DataSource = dataTable;
// ست کردن سایز ستون تصاویر به مقدار ثابت
dataGridView1.Columns[0].Width = 100;
در این کد، ابتدا مسیر پوشه حاوی تصاویر را تعیین کرده و سپس با استفاده از Directory.GetFiles، همه فایلهای تصویری موجود در پوشه را برمیگردانیم. سپس برای هر فایل تصویری در لیست، تصویر را با استفاده از Image.FromFile بخوانید و به دیتاتیبل اضافه کنید. در نهایت، دیتاتیبل را به گریدویو ست کرده و سایز ستون تصاویر را به مقدار ثابت تنظیم میکنیم.
البته چند نکته در خصوص این پاسخ کامل هست که استفاده کننده باید در نظر بگیره :
اگر مشخص میشد شما از دات نت کور استفاده میکنین یا دات نت فریمورک خیلی بهتر بود.
1- Directory.GetFiles اگر به فایل یا پوشه ای بر بخوره که شما بهش دسترسی ندارین فورا خطا میده و چون این خطا داخلی هست شما نمیتونین Ignore کنین ، مگر اینگه یه جورایی تابع GetFiles رو خودتون بنویسین، البته این موضوع مربوط به دات نت فریم ورک هست ، در خصوص دانت نت کور این تابع مدیریت خطاهاش بهبود پیدا کرده.
2-اگر تعداد پوشه ها و فایل های شما زیاد باشه ، که در یک پروژه پلاکخوانی برای من 1.5 ترابایت بود ! کاربر شما باید دقیقه ها و گاها ساعت ها برای Iterate کردن و پیمایش صبر کنه و در این حالت نرم افزار شما قطعا کرش میکنه ، راه حل اصولیش اینه که شما همین تابع رو به صورت async/await استفاده کنین که به صورت پیشفرض به دلیل نامعلومی در دانت تعبیه نشده ! و باید خودتون بنویسیدش ، زیاد پیچیده نیست ولی با توجه به اینکه شما در ترد UI هم فعالیت دارین حتما خطای Cross-Thread میگیرین که مدیریتش کمی پیچیده میشه.
یه راه حل جایگزین استفاده از توابعی هست که اصطلاحا yield هستند و همون لحظه که فایل رو پیمایش کردند نتیجه رو بدون از دست دادن context به شما برمیگردونن.
foreach (string file in Directory.EnumerateFiles(@"D:", "*.cs", SearchOption.AllDirectories))
{
Console.WriteLine(file);
// Or whatever you want to do with damn file !
}
توضیحات : توجه کنین به جای GetFiles از EnumerateFiles استفاده شده و در آخر دیگه ()ToList نباید داشته باشه و در اینجا دیگه ما همه فایل ها رو نمیگیرم کپی کنیم توی لیست و بعد پیمایش کنین ، همون لحظه در حلقه هر کاری داریم انجام میدیم.
آخرین ویرایش به وسیله ShayanFiroozi : یک شنبه 21 خرداد 1402 در 16:29 عصر