PDA

View Full Version : سوال: تعریف مجموعه قبل از foreach یا در شرطش



احمد سامعی
سه شنبه 30 شهریور 1389, 23:51 عصر
سلام

من می خوام اطلاعات فایل ها و ساب فولدرهای یک فولدر بدست بیارم. کدام یک از دستورات زیر صحیح هست ؟


foreach (string fls in Directory.GetFiles(SourcePath))

یا


string[] files = Directory.GetFiles(SourcePath);
foreach (string fls in files)

منظورم اینکه در دستور دوم یک بار متد دریافت اطلاعات فراخوانی می شه اما در دستور دوم به چه شکل هست ؟

و اگر آرایه ای که تعریف کردیم اعضاء زیادی داشته باشه مشکل پیش نمی یاره ؟

sinashahab
چهارشنبه 31 شهریور 1389, 00:43 صبح
این دو در نهایت یه فرایند رو اجرا می کنن. حالا توی کد شماره 1 فقط ددر نوشتن یه خط فرقشه ولی دی کل خود برنامه مثل کد دوم یه فضا به این قسمت میده :
Directory.GetFiles(SourcePath)

برای سوال دومت هم مشکلی خاضی به وجود نمیاد:چشمک:.

fjm11100
چهارشنبه 31 شهریور 1389, 09:18 صبح
کلاس DirectoryInfo کاملتر و بهتره

اَرژنگ
چهارشنبه 31 شهریور 1389, 09:43 صبح
سلام

من می خوام اطلاعات فایل ها و ساب فولدرهای یک فولدر بدست بیارم. کدام یک از دستورات زیر صحیح هست ؟


foreach (string fls in Directory.GetFiles(SourcePath))

یا


string[] files = Directory.GetFiles(SourcePath);
foreach (string fls in files)

منظورم اینکه در دستور دوم یک بار متد دریافت اطلاعات فراخوانی می شه اما در دستور دوم به چه شکل هست ؟

و اگر آرایه ای که تعریف کردیم اعضاء زیادی داشته باشه مشکل پیش نمی یاره ؟
برایه اینکه فرق دارند و یا ندارند را خوب متوجه بشید:
۱. با یک برک پوینت در دیباگ باهاشام کار کنید، مابین یک برک در فلدری که امتحان میکنید یک دایرکتوری دیگر ایجاد کنید و ادامه بدید. (اینکه اسمه دایرکتوری با a شروع شده باشد و یا z تفاوت دارد، چرا؟)
اگر اعضا زیاد باشند (بستگی دارد زیاد به چی بگید، در بعضی شرائط ۲ عدد بزرگی است)، بستگی به اینکه چکاری سعی میکنید انجام بدید ممکنه مشکل ایجاد بشه ممکنه هم که نه با بهترین روش ممکن هم همان جواب را دریافت کنید (در شرائط خاصی). حالا اینکه چی انجام میدید و چه شرائطی باید مراعات بشند سوال دیگری است.

ali_autumnal
چهارشنبه 31 شهریور 1389, 09:50 صبح
براي فايل ها استفاده از Fileinfo و و براي دايركتري ها استفاده از DirectoryInfo کاملتر و بهتر.

تعريف مجموعه هم غالبا قبل از حلقه انجام ميدم.

اَرژنگ
چهارشنبه 31 شهریور 1389, 11:56 صبح
تعريف مجموعه هم غالبا قبل از حلقه انجام ميدم.
مگر بعد از حلقه هم میشه؟

sinashahab
چهارشنبه 31 شهریور 1389, 12:49 عصر
منظورش این بود عزیز:

string[] files = Directory.GetFiles(SourcePath);
foreach (string fls in files)

احمد سامعی
چهارشنبه 31 شهریور 1389, 14:02 عصر
ممنون از همه دوستان در واقع کل صورت مسئله این هست.

یک برنامه تغییر سایز عکس هست. باید کاربر مسیر یک فولدر به برنامه بده بعد برنامه تمام فایل های عکس موجود در این مسیر به سایز جدید تغییر داده و در مسیر جدید ذخیره می کنه

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

جناب آرژنگ
1. فکر می کنم در این برنامه دریافت اطلاعات فایلها آنقدر زمانی کمی داشته باشه که کاربر نتونه همزمان در فولدر اصلی تغییری ایجاد کنه که روی کار ما تاثیر بزاره در واقع سوال من این بود که وقتی از foreach استفاده می کنیم متد دریافت اطلاعات به ازای هر بار انجام حلقه دوباره تکرار می شه یا یک بار فراخوانی شده و نتیجه اش CLR نگه داری می کنه یا نه چون اگر اینطوری باشه تفاوتی در دو دستور نیست اما اگر به ازای هر بار اجرای حلقه یک بار فراخوانی بشه هزینه اضافی روی CPU ایجاد می کنیم
2. من از یک < Generic.List<StringBuilder برای نگاه داری نام و مسیر فایل ها استفاده کردم و در حلقه زیر اطلاعات به اون اضافه می کنم ما چون نمی دونیم چه تعداد فایل یا دایرکتوری در مسیر انتخاب شده داریم به نظرتون روش بهینه برای این کار چیه ؟

try
{
SearchOption op = (chAllDirectories.Checked) ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
string[] extensions = new string[] { "*.jpg", "*.jpe", "*.jfif", "*.tif", "*.gif", "*.png", "*.dib", "*.btm" };
foreach (string extension in extensions)
{
foreach (string FileName in Directory.GetFiles(this.folderBrowserDialog1.Selec tedPath, extension, op))
{
_Paths.Add(new StringBuilder(FileName));
}
}
}
catch { }

در ضمن من چون فقط مسیر و پسوند فایل می خوام پس فکر نمی کنم جامع بودن DirectoryInfo چندان اهمیتی داشته باشه چون درنهایت هر دو کلاس به متد GetFiles می رسن که یکی هست دوستان اگر نظری در این رابطه هم دارن بفرمایند