PDA

View Full Version : افزودن تصاویر به گریدویو از داخل پوشه



safari_m4
سه شنبه 16 خرداد 1402, 13:45 عصر
سلام و وقت بخیر دوستان چطوری عکسهایی که داخل یک پوشه در یکی از درایوهای سیستم ذخیره شده را داخل گریدویو نمایش بدهم با تشکر و سپاس

پرستو پارسایی
سه شنبه 16 خرداد 1402, 23:37 عصر
سلام و وقت بخیر دوستان چطوری عکسهایی که داخل یک پوشه در یکی از درایوهای سیستم ذخیره شده را داخل گریدویو نمایش بدهم با تشکر و سپاس

// مسیر پوشه حاوی تصاویر
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 بخوانید و به دیتاتیبل اضافه کنید. در نهایت، دیتاتیبل را به گریدویو ست کرده و سایز ستون تصاویر را به مقدار ثابت تنظیم می‌کنیم.

ShayanFiroozi
چهارشنبه 17 خرداد 1402, 01:49 صبح
// مسیر پوشه حاوی تصاویر
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 نباید داشته باشه و در اینجا دیگه ما همه فایل ها رو نمیگیرم کپی کنیم توی لیست و بعد پیمایش کنین ، همون لحظه در حلقه هر کاری داریم انجام میدیم.

safari_m4
چهارشنبه 17 خرداد 1402, 13:56 عصر
البته چند نکته در خصوص این پاسخ کامل هست که استفاده کننده باید در نظر بگیره :

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

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 نباید داشته باشه و در اینجا دیگه ما همه فایل ها رو نمیگیرم کپی کنیم توی لیست و بعد پیمایش کنین ، همون لحظه در حلقه هر کاری داریم انجام میدیم.

از دات نت فریمورک استفاده می کنم
تشکر و سپاس از بذل توجه و پاسختان ممنون