2013-07-20 6 views
1

Итак, вот что у меня есть сейчас. Я получаю много красных линий в этом и не знаю, почему. Мне нужно знать, как взять код, который вы мне дали, и поместить его в метод checkbox, чтобы он запускался, когда вы нажимали кнопку, помеченную далее.Ищем файл на компьютере

public Question() 
{ 
    InitializeComponent(); 
} 

private void Question_Load(object sender, EventArgs e) 
{} 

private void Exit_Click(object sender, EventArgs e) 
{ 
    Close(); 
} 

private void UnRe_CheckedChanged(object sender, EventArgs e) 
{ 
    if (UnRe.Checked == true) 
    { 
     string rootDirectory = System.IO.DriveInfo.GetDrives()[0].RootDirectory.FullName; 

     string[] files = System.IO.Directory.GetFiles(rootDirectory, 
         "file.exe", System.IO.SearchOption.AllDirectories); 
    } 
}// closes class 

private void Infection_CheckedChanged(object sender, EventArgs e) 
{ 
    if (Support.Checked == true) 
    {} 
} 

private void Other_CheckedChanged(object sender, EventArgs e) 
{} 

private void Next_Click(object sender, EventArgs e) 
{} 

IEnumerable<string> GetAllAuthorizedFiles(string root, string searchPattern) 
{ 
    foreach (var fname in GetAuthorizedFiles(root, searchPattern)) 
     yield return fname; 

    foreach (var dir in GetAuthorizedDirectories(root)) 
    { 
     foreach (var fname in GetAllAuthorizedFiles(dir, searchPattern)) 
      yield return fname; 
    } 
} 

string[] GetAuthorizedDirectories(string root) 
{ 
    try 
    { 
     return Directory.GetDirectories(root); 
    } 
    catch (UnauthorizedAccessException) 
    { 
     return new string[0]; 
    } 
} 

string[] GetAuthorizedFiles(string root, string searchPattern) 
{ 
    try 
    { 
     return Directory.GetFiles(root, searchPattern); 
    } 
    catch (UnauthorizedAccessException) 
    { 
     return new string[0]; 
    } 
} 
+3

Что ** является ** Ошибка? –

+3

SearchOption.AllDirectories не будет работать из корневого каталога диска C: вы всегда будете работать в каталоге, к которому у вас нет доступа для чтения. Каталог, содержащий точки восстановления. Вам придется сделать это медленным способом, итерации каталогов самостоятельно. Буквально медленный btw, это может легко занять несколько минут на терабайтном диске. Не тот код, который вам когда-либо понравился. –

+4

@HansPassant - вы должны повернуть комментарий в ответ – Axarydax

ответ

1

Если время не является проблемой, как вы говорите, вы можете перебирать все каталоги, пытаясь получить их файлы. Всякий раз, когда вы сталкиваетесь с UnauthorizedAccessExcpetion, вы просто игнорируете этот каталог и переходите к следующему в строке.

Вот implemantation рекурсивного метода файл перечисления, как это было предложено Hans Passant:

IEnumerable<string> GetAllAuthorizedFiles(string root, string searchPattern) 
{ 
    foreach (var fname in GetAuthorizedFiles(root, searchPattern)) 
     yield return fname; 

    foreach (var dir in GetAuthorizedDirectories(root)) 
    { 
     foreach (var fname in GetAllAuthorizedFiles(dir, searchPattern)) 
      yield return fname; 
    } 
} 

string[] GetAuthorizedDirectories(string root) 
{ 
    try 
    { 
     return Directory.GetDirectories(root); 
    } 
    catch (UnauthorizedAccessException) 
    { 
     return new string[0]; 
    } 
} 

string[] GetAuthorizedFiles(string root, string searchPattern) 
{ 
    try 
    { 
     return Directory.GetFiles(root, searchPattern); 
    } 
    catch (UnauthorizedAccessException) 
    { 
     return new string[0]; 
    } 
} 

А вот как бы вы назвали его из кода:

string[] files = GetAllAuthorizedFiles(rootDirectory, "File.exe").ToArray(); 
Смежные вопросы