0

程序遍历目录并将 Avi 文件打印到文本框

    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”吗

4

5 回答 5

2

现在没有办法让AllDirectories选项跳过特定目录或忽略遍历时发生的异常。您将需要手动搜索目录结构并处理发生的错误

于 2013-03-29T19:50:10.187 回答
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 是否有您想要跳过的值。

于 2013-03-29T19:52:44.033 回答
0

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

于 2013-03-29T19:49:27.280 回答
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();
    }

}
于 2013-03-29T20:01:22.693 回答
0

我刚刚尝试使用 Lambda 表达式从 VS 2017 中返回的字符串列表中排除两个文件夹。我观察到一些奇怪的事情。如果 lambda 表达式直接添加到目录检索中,如上面显示的字符串,列表仍会返回 $RECYCLEBIN,但不会返回 SVI 文件夹。为了使 lambda 正常工作,我需要将 2 个操作分开,即:

 var allDirs = rootDir.GetDirectories("*",SearchOption.TopDirectoryOnly);
 var filteredDirs = allDirs.Where(d=> !d.Name.Equals("System Volume Information") && !d.Name.Equals("$RECYCLE.BIN"));
于 2018-10-17T09:09:56.897 回答