PDA

View Full Version : سوال: پیمایش کل هارد دیسک



hamed_antiphp
سه شنبه 22 مرداد 1387, 17:00 عصر
با سلام خدمت دوستان
یک کمک کوچولو می خواستم :ناراحت:. من یک تایع دارم که روی فایلهای html , htm کار می کنه . حالا من می خوام مثل آنتی ویروس ها که کل هارد دیسک رو جستجو می کنن این کارو انجام بدم یعنی توی کل هارد بگرده هر فایلی که html ya htm بود رو به تابع clean (string filename) بفرسته .
پیشاپیش مرسی:قلب:

DarkSoroush
سه شنبه 22 مرداد 1387, 20:04 عصر
با سلام خدمت دوستان
یک کمک کوچولو می خواستم :ناراحت:. من یک تایع دارم که روی فایلهای html , htm کار می کنه . حالا من می خوام مثل آنتی ویروس ها که کل هارد دیسک رو جستجو می کنن این کارو انجام بدم یعنی توی کل هارد بگرده هر فایلی که html ya htm بود رو به تابع clean (string filename) بفرسته .
پیشاپیش مرسی:قلب:
شما میتونید از تابع System.IO.DriveInfo.GetDrives() که ارایه ای از درایور ها را برمیگردونه استفاده کنید و سپس با استفاده از یک while پس از پیمایش هر درایور با استفاده از متد و پروپرتی زیر تمام فایلها با پسوند html را در یک ارایه دیگر دیافت کنید:


.RootDirectory.GetFiles("*.html", IO.SearchOption.AllDirectories)

hamed_antiphp
چهارشنبه 23 مرداد 1387, 00:42 صبح
سلام
حاجی میشه کد کامل بزاری خیلی عجله دارم .

DarkSoroush
چهارشنبه 23 مرداد 1387, 19:02 عصر
معمولا توی فروم فقط میشه سر نخ رو دست فرد داد و فرد مورد نظر باید خودش تا آخر نخ بره نه اینکه تا انتها یکبار ببریمش.
با این حال اینم نمونه:


foreach (System.IO.DriveInfo d_Drive in System.IO.DriveInfo.GetDrives())
{
foreach (System.IO.FileInfo f_file in d_Drive.RootDirectory.GetFiles("*.html", System.IO.SearchOption.AllDirectories))
{
//YOUR CODE HERE Example: Console.WriteLine(f_file.FullName);
}
}


در ضمن من حاجی نیستم عزیز. متاسفانه

hamed_antiphp
پنج شنبه 24 مرداد 1387, 01:09 صبح
سلام برادر سروش
عزیز این کد مشکلش اینه که به پوشه
System Volume Information
که میرسه Access to the path 'C:\System Volume Information' is denied. دیگه ادامه نمیده بعد هم یک سطح از پوشه ها رو جستجو میکنه

mohsen_csharp
پنج شنبه 24 مرداد 1387, 13:42 عصر
این مثال رو نگاه کن

hamed_antiphp
پنج شنبه 24 مرداد 1387, 16:01 عصر
مرسی آقا محسن اما از تابع بازگشتی استفاده کردی تا بیاد جستجو تموم بشه در حالت هنگ میمونه برنامه . ببین راهی جز این نداره ؟؟؟

publicvoid dirs(string path)
{
try
{
string[] d = System.IO.Directory.GetDirectories(path);
string[] f = System.IO.Directory.GetFiles(path);
foreach (string st1 in d)
{
if (!st1.ToLower().Contains("system volume information"))
{
// t1.Nodes.Add(st1.Substring(st1.LastIndexOf('\\') + 1));
// richTextBox2.AppendText(st1.ToString());
dirs(st1);
}
}
foreach (string st2 in f)
{
if (st2.ToLower().Contains(".htm") || st2.ToLower().Contains(".html") || st2.ToLower().Contains(".xhtml") || st2.ToLower().Contains(".vhtml"))
{
richTextBox3.AppendText(st2.ToString());
richTextBox3.AppendText("\n");
//label2.Text = st2.ToString();
//t1.Nodes.Add(st2.Substring(st2.LastIndexOf("\\") + 1));
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}


private void button5_Click(object sender, EventArgs e)
{
System.IO.DriveInfo[] dir = System.IO.DriveInfo.GetDrives();
foreach (System.IO.DriveInfo process in dir)
{
listBox1.Items.Add(process.Name.ToString());
if (process.DriveType.ToString() == "Fixed")
{
dirs(process.Name.ToString ());
}
}

}

DarkSoroush
شنبه 26 مرداد 1387, 02:45 صبح
ببخشید من نبودم. در VB یک دستوری هست به صورت:
On Error Resume Next
همچین دستوری را برای c# ندیدم ولی اگر همچین دستوری پیدا کردی اول کدی که دادم بزاری مشکل حل میشه در غیر اینصورت باید قبلش سکیوریتی فولدر را امتحان کنی یا دستور را کوچکتر رو یک try بزاری.
این دسوتوری که محسن جان گذاشتند خوبه ولی مشکل فقط system volume information نیست. هر فولدی میتونه امکان خوندن رو از طریق security permission ها نده و برنامه با ارور مواجه بشه.
مثالم رو به صورت زیر تصحیح کردم:
تابع زیر را بنویس:


private System.Collections.ObjectModel.Collection<System.IO.FileInfo> GetFiles (string KeyWord,System.IO.DirectoryInfo root,ref System.Collections.ObjectModel.Collection<System.IO.FileInfo> DefCollection)
{
if (DefCollection == null) DefCollection = new System.Collections.ObjectModel.Collection<System.IO.FileInfo>();
try
{
foreach (System.IO.FileInfo f_file in root.GetFiles(KeyWord, System.IO.SearchOption.TopDirectoryOnly))
{
DefCollection.Add(f_file);
}
foreach (System.IO.DirectoryInfo f_folder in root.GetDirectories())
{
GetFiles(KeyWord,f_folder,ref DefCollection);
}
}
catch
{
}
return DefCollection;
}



و در کدت هم:


foreach (System.IO.DriveInfo d_Drive in System.IO.DriveInfo.GetDrives())
{
System.Collections.ObjectModel.Collection<System.IO.FileInfo> temp = new System.Collections.ObjectModel.Collection<System.IO.FileInfo>();
foreach (System.IO.FileInfo f_file in GetFiles("*.html", d_Drive.RootDirectory, ref temp))
{
// your code here Console.WriteLine(f_file.FullName);
}
}


این دستور را حتی اگر در یک ترید دیگه اجرا کنی نتایج رو یکجا برمیگردونه پس نمیتونی در حال جستجو فایلها رو تغییر بدی. بعنی اول لیست فایلها را بدست میاری و بعد تغییرات لازم رو میتونی اعمال کنی. البته کد مذکور درایو به درایو به شما این امکان رو میده. اگر توقع داری فولدر به فولدر این امکان را داشته باشی باید کدت را در خود تابع جای کد " DefCollection.Add(f_file);" بنویسی که معقول نیست.
موفق باشی
- سروش

fazelit
شنبه 05 مرداد 1392, 22:03 عصر
سلام برای جلوگیری از هنگ شدن از دستور

Application.DoEvents();

استفاده کن یعنی در کل میشه


void Dirs(TreeNode t1, string path)
{
try
{
string[] d = System.IO.Directory.GetDirectories(path);
string[] f = System.IO.Directory.GetFiles(path);
foreach (string st1 in d)
{
if (1==1)//!st1.ToLower().Contains("system volume information"))
{
t1.Nodes.Add(st1.Substring(st1.LastIndexOf('\\') + 1));
listBox1.Items.Add(st1);
Refresh();
Application.DoEvents();
Dirs(t1.LastNode, st1);
}
}
foreach (string st2 in f)
{
//t1.Nodes.Add(st2.Substring(st2.LastIndexOf("\\") + 1));
listBox1.Items.Add(st2);
Refresh();
}
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
}

}

farhad.k.t
چهارشنبه 20 شهریور 1392, 12:47 عصر
یا برنامه را با حالتAdministrator باز کنید، و یا همان طور که یکی از دوستان گفتند Permission ها را تغییر بدید.
بهتر است در صورتی که می خواهید با System.IO کار کنید ،VS را به حالت Administrator باز نمایید.