PDA

View Full Version : خطای StackOverFlow برنامه جست و جوی درختی یک نوع خاص از فایل



mrmaleki
جمعه 06 تیر 1393, 23:30 عصر
سلام من دارم یک برنامه مینویسم که دایرکتوری و نوع فایل مورد نظر را با اشتفاده از CheckBox از کاربر دریافت میکنه و تو اون دایرکتوری و دایرکتوری های تو در تو اسم تمام فایل هایی رو که از اون نوع هستند رو توی یک فایل txt وارد میکنه فقط نمیدونم چرا واسه نوع Mp3 جواب میده و وارد میکنه ولی واسه نوع های دیگه که تیک میزنم ارور StackOverFlow میده

if (System.IO.Directory.Exists(textBox1.Text))
{
// Getting DirectoryInfo from textbox Which Selected in folderBrowserDialog
System.IO.DirectoryInfo targetDirectory = new System.IO.DirectoryInfo(textBox1.Text);


// Getting all checkedIndices which user Selected from checkedListBox

string[] fileExtensions = null;
// Move one by one throught checkedIndices which user choose from checkedListBox
if(checkBox1.Checked)
{
fileExtensions = new string[] { ".mp3" };
}
if(checkBox2.Checked)
{
fileExtensions = new string[] { ".jpj", ".png" };
}
if(checkBox3.Checked)
{
fileExtensions = new string[] { ".mkv", ".mp4", ".mov", ".mpeg2" };
}
if(checkBox3.Checked)
{
fileExtensions = new string[] { ".txt", ".doc" };
}
targetDirectory.GetFileTypeName(minNumeric: numericUpDown2.Value
,maxNumeric: numericUpDown1.Value, extensions:fileExtensions);
}

و کلاس جست و جوی درختی

public static class DirectoryTreeSearcher
{
static System.Collections.Specialized.StringCollection log =
new System.Collections.Specialized.StringCollection();


public static void GetFileTypeName(this DirectoryInfo root, decimal minNumeric
,decimal maxNumeric ,params string[] extensions)
{
DirectoryInfo[] subDirectories = null;
FileInfo[] files = null;
if(extensions == null)
throw new ArgumentNullException("extension");


try
{
// Getting fileInfo With specific Syntax inside root directory inside root
files = root.GetFiles()
.Where(f => extensions.Contains(f.Extension.ToLower()))
.ToArray();
}


catch (UnauthorizedAccessException e)
{
// Store UnauthorizedAccessException inside log string Collection
log.Add(e.Message);
}


if (files != null)
{
// Stream a text file using StreamWriter and Return fileNames inside
// directory


using (StreamWriter textFile = new StreamWriter(@"D:\NewTextDocument.txt", true))
{
foreach (FileInfo fi in files)
{
// Convert File Lenght from byte to Kbyte
decimal fileLengthInKB = fi.Length / 1024;
// check whether filelenght is between maximum and minimum or not
if (fileLengthInKB >= minNumeric && fileLengthInKB <= maxNumeric)
{
textFile.WriteLine(fi.Name);
}
}
}
// Getting All Subdirectories Inside Directory And Search Again files
// inside this Directories and write all files inside that
subDirectories = root.GetDirectories();
foreach (System.IO.DirectoryInfo dir in subDirectories)
{
root.GetFileTypeName(minNumeric, maxNumeric, extensions);
}
}
}
}

Mahmoud.Afrad
شنبه 07 تیر 1393, 00:13 صبح
خط 56 باعث میشه تابع از نوع بازگشتی باشه منتها اشتباه اینه که همیشه روی root انجام میشه و این باعث میشه هیچ وقت فولدرهای داخلی پیمایش نشن و البته تا بینهایت این متد روی پوشه root عمل میکنه و باعث سرریز استک میشه.
باید روی dir فراخوانی داخلی صورت بگیره.

foreach (System.IO.DirectoryInfo dir in subDirectories)
{
dir.GetFileTypeName(minNumeric, maxNumeric, extensions);
}