2013-03-29 23 views
0

計劃經過目錄和打印AVI文件到文本框使C#搜索硬盤驅動器排除目錄

public FileList() 
    { 
     InitializeComponent(); 
     //Sets Drive Choices 
     DriveInfo[] drives = DriveInfo.GetDrives(); 
     foreach (DriveInfo d in drives) 
     { 
      driveChoice.Items.Add(d); 
     } 
    } 

    //Find Video Files 
    private void btnStart_Click(object sender, EventArgs e) 
    {    
     String path = driveChoice.Text; 
     if (path != "C:\\") 
     { 
      String[] allfiles = Directory.GetFiles(path, "*.avi*", System.IO.SearchOption.AllDirectories); 
      foreach (String file in allfiles) 
      { 
       tbFileList.Text = tbFileList.Text + file + "\r\n"; 
      } 
     } 
     else 
     { 
      Application.Exit(); 
     } 

    } 
} 

,當我跑得到一個錯誤。

未經授權的訪問 'I:\ $ RECYCLE.BIN \ S-1-5-21-1332477098-3306142970-3529014387-1000 \'

我可以設置程序只是跳過「I:\ $ RECYCLE.BIN」

回答

2

看起來您需要切換到遞歸解決方案或其他一些循環,而不是使用「AllDirectories」。這樣你可以提供一些跳過邏輯。

看到此鏈接http://support.microsoft.com/kb/303974

與此代碼段從該頁面:

void DirSearch(string sDir) 
    { 
     try 
     { 
      foreach (string d in Directory.GetDirectories(sDir)) 
      { 
       foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
       { 
        lstFilesFound.Items.Add(f); 
       } 
       DirSearch(d); 
      } 
     } 
     catch (System.Exception excpt) 
     { 
      Console.WriteLine(excpt.Message); 
     } 
    } 

在該代碼中你只是檢查SDIR你想跳過值。

+0

你還是會碰到潛在的'SecurityException'或'UnauthorizedAccessException'情況與上面的代碼被拋出。如果你想跳過文件夾,你的安全並不是你所能訪問的,我建議在過濾掉這些異常的try {} catch {}塊中包裝內部'foreach'和遞歸'DirSearch(d)'塊。 – ohTHATaaronbrown

0

if !filePath.Contains("I:\$RECYCLE.BIN")

2

現在有沒有辦法有AllDirectories選擇跳過特定目錄或忽略遍歷發生的異常。您需要手動搜索目錄結構並處理髮生的錯誤

0

使用lambda語句來排除系統目錄:

public FileList() 
{ 
    InitializeComponent(); 
    //Sets Drive Choices 
    DriveInfo[] drives = DriveInfo.GetDrives(); 
    foreach (DriveInfo d in drives) 
    { 
     driveChoice.Items.Add(d); 
    } 
} 

//Find Video Files 
private void btnStart_Click(object sender, EventArgs e) 
{    
    String path = driveChoice.Text; 
    if (path != "C:\\") 
    { 
     DirectoryInfo root = new DirectoryInfo(path); 
     var rootFiles = root.GetFiles("*.avi"); 
     var rootDirs = root.GetDirectories("*", SearchOption.TopDirectoryOnly).Where(d => !d.Name.Equals("System Volume Information") && !d.Name.Equals("$RECYCLE.BIN")); 
     foreach (var file in rootFiles) 
     { 
      tbFileList.Text = tbFileList.Text + file.FullName + "\r\n"; 
     } 
     foreach (var dir in rootDirs) 
     { 
      foreach (var dirFile in dir.GetFiles("*.avi", SearchOption.AllDirectories)) 
      { 
       tbFileList.Text = tbFileList.Text + dirFile.FullName + "\r\n"; 
      } 
     } 

    } 
    else 
    { 
     Application.Exit(); 
    } 

}