PDA

View Full Version : آموزش: بدست آوردن نام فایل های یک پوشه (مثل پوشه اصلی برنامه)



sagggad
سه شنبه 08 بهمن 1392, 13:23 عصر
با عرض سلام
بدست اوردن فایل های موجود در یک پوشه بوسیله ی تابع GetFiles امکان پذیر میباشد
مثال:

foreach (var i in (new Microsoft.VisualBasic.Devices.ServerComputer()).Fi leSystem.GetFiles("D:\\", Microsoft.VisualBasic.FileIO.SearchOption.SearchTo pLevelOnly, null))
{
ListBox1.Items.Add(i);
}

این کد تمامی فایل های موجود در داریو D را به شما در یک لیست باکس نمایش میدهد
حالا یک موضوع جالب:
در سی شارپ گاهی اوقات ما در سیستم خود یک فایل را داریم (مثلا یک موسیقی) و میخواهیم این فایل به صورت موزیک متن برنامه اجرا شود
حالا این فایل آیا بر روی سیستم مشتری هست؟؟
طبیعتا جواب منفی است...
حالا حتی ما فرض را بر این میگیریم که این فایل در یک قسمت از سیستم مشتری موجود است ، اما آیا آدرس دقیق آن مشخص است؟؟
خیر، معلوم نیست
در این جور مواقع ما مجبوریم یک فایل را همراه برنامه برای کاربر بفرستیم
حالا باز هم ما نمیدانیم کاربر فولدر پروژه را در کجا قرار میدهد؟؟
یعنی مثلا ما به برنامه آدرس داده ایم که به درایو D برو و در فولدر مثلا Windows Application 10 که پوشه ی برنامه است یک فایل موزیک اجرا کن
حالا کاربر ممکن است فولدر برنامه را در روی دسکتاپ قرار دهد
در اینصورت برنامه نمیتواند این فایل را پیدا کند
حالا راه حل:
فایل های لازم را در آدرس پروژه و فولدر Bin>>>Debug قرار میدهیم
آیا میدانید چطور میتوان برنامه را به طور خودکار به پوشه ی Bin>>>>Debug پروژه هدایت کرد؟؟؟؟
این آدرس پوشه ی Bin>>>>>Debug برنامه است:

".\\"
با گذاشتن یک نقطه و بعد هم دو بک اسلش در آدرس برنامه به پوشه ی Debug خود هدایت میشود
حالا نحوه ی استفاده از این کد برای بدست آوردن محتویات پوشه ی Bin>>>Debug :


foreach (var i in (new Microsoft.VisualBasic.Devices.ServerComputer()).Fi leSystem.GetFiles(".\\", Microsoft.VisualBasic.FileIO.SearchOption.SearchTo pLevelOnly, null))
{
ListBox1.Items.Add(i);
}
لیست تمامی فایل های موجود در پوشه ی اصلی برنامه در لیست باکس نشان داده میشود
فقط کافیست آدرس پوشه را به برنامه بدهید
امیدوارم مفید بوده باشه
موفق باشید
تشکر یادتون نره

forodo
سه شنبه 08 بهمن 1392, 16:18 عصر
سلام
اینم هست:
فکر می کنم راحتتر باشه:

// پیدا کردن تمامی فایلهای موجود در فولدر
foreach (string files in System.IO.Directory.GetFiles(@"E:\","*.*",System.IO.SearchOption.AllDirectories))
{
// فیلتر کردن نتایج
if (System.IO.Path.GetFileName(files) != "Desktop.ini")
{
// اضافه کردن فایل پیدا شده به لیست باکس
listbox1.items.Add(System.IO.Path.GetFileName(file s));
}
}

که شما می توانید به جای *.* فرمت فایلی که می خواهید رو جستجو کنید. مثلاً mp3 که می شه mp3.*
و برای بدست آوردن تمامی فولدرهای داخل یک فولدر کافیست به جای GetFiles از GetDirectiry استفاده کنید.

sagggad
سه شنبه 08 بهمن 1392, 16:24 عصر
سلام
اینم هست:
فکر می کنم راحتتر باشه:

// پیدا کردن تمامی فایلهای موجود در فولدر
foreach (string files in System.IO.Directory.GetFiles(@"E:\","*.*",System.IO.SearchOption.AllDirectories))
{
// فیلتر کردن نتایج
if (System.IO.Path.GetFileName(files) != "Desktop.ini")
{
// اضافه کردن فایل پیدا شده به لیست باکس
listbox1.items.Add(System.IO.Path.GetFileName(file s));
}
}

که شما می توانید به جای *.* فرمت فایلی که می خواهید رو جستجو کنید. مثلاً mp3 که می شه mp3.*
و برای بدست آوردن تمامی فولدرهای داخل یک فولدر کافیست به جای GetFiles از GetDirectiry استفاده کنید.
سلام
ممنون
ولی کدهای من کلا سه خط بود و خیلی راحت
بیشتر توضیح داده بودم راجع به کارش

shahryari
سه شنبه 08 بهمن 1392, 16:47 عصر
پروپرتی items متدی بنام addRange دارد که آرایه میگیرد که به عبارتی در یک خط و بدون حلقه :بامزه:
listBox1.Items.AddRange(System.IO.Directory.GetFil es (@"C:\"));

sagggad
سه شنبه 08 بهمن 1392, 16:56 عصر
پروپرتی items متدی بنام addRange دارد که آرایه میگیرد که به عبارتی در یک خط و بدون حلقه :بامزه:
listBox1.Items.AddRange(System.IO.Directory.GetFil es (@"C:\"));
ممنون
این که همون کدهای منه!!!
فقط با یک کم تفاوت
وگرنه همون تابع استفاده شده

shahryari
سه شنبه 08 بهمن 1392, 17:08 عصر
ممنون
این که همون کدهای منه!!!
فقط با یک کم تفاوت
وگرنه همون تابع استفاده شده
------------------
:متفکر:

----------
foreach (var i in (new Microsoft.VisualBasic.Devices.ServerComputer()).Fi leSystem.GetFiles("D:\\", Microsoft.VisualBasic.FileIO.SearchOption.SearchTo pLevelOnly, null))
{
ListBox1.Items.Add(i);
}
listBox1.Items.AddRange(System.IO.Directory.GetFil es (@"C:\\"));

بله .....
اینها دقیقا شبیه هم هستند با کمی تفاوت !!!!!!!! :چشمک:

sagggad
سه شنبه 08 بهمن 1392, 17:11 عصر
------------------
:متفکر:

----------
foreach (var i in (new Microsoft.VisualBasic.Devices.ServerComputer()).Fi leSystem.GetFiles("D:\\", Microsoft.VisualBasic.FileIO.SearchOption.SearchTo pLevelOnly, null))
{
ListBox1.Items.Add(i);
}
listBox1.Items.AddRange(System.IO.Directory.GetFil es (@"C:\\"));

بله .....
اینها دقیقا شبیه هم هستند با کمی تفاوت !!!!!!!! :چشمک:
نه عزیزم
منظورم اینه که از یک تابع استفاده شده
منو مسخره میکنی؟!!!!:لبخند:

shahryari
سه شنبه 08 بهمن 1392, 17:22 عصر
دوست من در اصل کد شما صحیح تره ، خواستم با متد ادد رنج آشنا بشید....
.
.
حالا بگو ببینم در کدهای بالا که شما نوشتید چطوری میتونیم با یک پروگرس بار ، وضعیت پرشدن لیست باکس رو نمایش بدیم؟؟
یک راهنمایی میکنم : ماکزیمم پروگرسبار باید برابر باشد با تعداد فایلهای موجود در پوشه ..

sagggad
سه شنبه 08 بهمن 1392, 17:34 عصر
دوست من در اصل کد شما صحیح تره ، خواستم با متد ادد رنج آشنا بشید....
.
.
حالا بگو ببینم در کدهای بالا که شما نوشتید چطوری میتونیم با یک پروگرس بار ، وضعیت پرشدن لیست باکس رو نمایش بدیم؟؟
یک راهنمایی میکنم : ماکزیمم پروگرسبار باید برابر باشد با تعداد فایلهای موجود در پوشه ..
متوجه نمیشم
یعنی چی وضعیت پر شدنش؟؟

forodo
سه شنبه 08 بهمن 1392, 17:42 عصر
سلام
ممنون
ولی کدهای من کلا سه خط بود و خیلی راحت
بیشتر توضیح داده بودم راجع به کارش
شما کد رو کامل خوندید؟ :متفکر: نه
اون یک خط اضافه برای فیلتر کردن چیزی هست که یافت شده.
اگه اون رو بردارید میشه 2 خط.

در مورد توضیحات:
شما کاملاً توضیح داده بودید و من دیگه تکرار مکررات نکردم فقط کدی رو گذاشتم که میشه به جای اون هم استفاده کرد.
چندتا راه مختلف وجود دارد در هر جای برنامه نویسی.
اشکالی نمی بینم اگر هرکس راهی را می داند بگوید و هرکس از هر کدوم که حال می کنه استفاده کنه.

پروپرتی items متدی بنام addRange دارد که آرایه میگیرد که به عبارتی در یک خط و بدون حلقه :بامزه:
listBox1.Items.AddRange(System.IO.Directory.GetFil es (@"C:\"));
الان من نمی دونستم همچین چیزی وجود دارد.
نمی دونم آیا برای datagridview هم می شه اینکار رو انجام داد یا نه.
ولی از این به بعد اگر قرار باشد ListBox رو پر کنم به این شکل پر می کنم. چون تعداد خط کمتر و واضح تر هستش.

forodo
سه شنبه 08 بهمن 1392, 17:45 عصر
دوست من در اصل کد شما صحیح تره ، خواستم با متد ادد رنج آشنا بشید....
.
.
حالا بگو ببینم در کدهای بالا که شما نوشتید چطوری میتونیم با یک پروگرس بار ، وضعیت پرشدن لیست باکس رو نمایش بدیم؟؟
یک راهنمایی میکنم : ماکزیمم پروگرسبار باید برابر باشد با تعداد فایلهای موجود در پوشه ..
همونطوری که خودتون گفتید ماکزیمم پروگرسبار رو برابر تعداد فایلها قرار می دهید و داخل foreach مقدار پروگرس بار رو یک واحد اضافه می کنید و برای نمایش من از کد جهنمی Application.doevent() استفاده کردم و تا حالا که هیچ اشکالی برام پیش نیومده.

// دادن تعداد فولدرهای موجود به ماکزیمم ردپروگرس بار
progressbar1.Maximum = JackieChanFilm;
// پیدا کردن تمامی فایلهای موجود در فولدر
foreach (string files in System.IO.Directory.GetFiles(@"E:\","*.*",System.I O.SearchOption.AllDirectories))
{
// فیلتر کردن نتایج
if (System.IO.Path.GetFileName(files) != "Desktop.ini")
{
progressbar1.value += 1

// اضافه کردن فایل پیدا شده به لیست باکس
listbox1.items.Add(System.IO.Path.GetFileName(file s));
Application.DoEvents();

}
}

forodo
سه شنبه 08 بهمن 1392, 17:58 عصر
هنگامی که دارید یک درایو رو دنبال فولدر می گردید ( \:E نه E:\New Folder ( در این حالت هیچ مشکلی نیست چون فولدرهای سیستمی داخل درایوها هستند نه داخل فولدرهای داخل درایو )) فولدرهای سیستمی باعث می شن که حالتون گرفته بشه که شما به این کدها بهشون ضدحال می زنید.

private void button2_Click(object sender, EventArgs e)
{
DirectoryInfo di = new DirectoryInfo(@"E:\");
foreach (DirectoryInfo MP3Folders in di.GetDirectories())
{
if ((MP3Folders.Attributes & FileAttributes.System) != FileAttributes.System)
{
foreach (string MP3Files in Directory.GetFiles(@"E:\" + MP3Folders.ToString(), "*.mp3", SearchOption.AllDirectories))
{
listBox1.Items.Add(Path.GetFileName(MP3Files));
}
}
}
}

sagggad
سه شنبه 08 بهمن 1392, 18:22 عصر
هنگامی که دارید یک درایو رو دنبال فولدر می گردید ( \:E نه E:\New Folder ( در این حالت هیچ مشکلی نیست چون فولدرهای سیستمی داخل درایوها هستند نه داخل فولدرهای داخل درایو )) فولدرهای سیستمی باعث می شن که حالتون گرفته بشه که شما به این کدها بهشون ضدحال می زنید.

private void button2_Click(object sender, EventArgs e)
{
DirectoryInfo di = new DirectoryInfo(@"E:\");
foreach (DirectoryInfo MP3Folders in di.GetDirectories())
{
if ((MP3Folders.Attributes & FileAttributes.System) != FileAttributes.System)
{
foreach (string MP3Files in Directory.GetFiles(@"E:\" + MP3Folders.ToString(), "*.mp3", SearchOption.AllDirectories))
{
listBox1.Items.Add(Path.GetFileName(MP3Files));
}
}
}
}



آقا من تسلیم
منفجرم کردید:لبخندساده: