Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使C#搜索硬盘驱动器排除目录_C#_Directory - Fatal编程技术网

使C#搜索硬盘驱动器排除目录

使C#搜索硬盘驱动器排除目录,c#,directory,C#,Directory,程序遍历目录并将Avi文件打印到文本框 public FileList() { InitializeComponent(); //Sets Drive Choices DriveInfo[] drives = DriveInfo.GetDrives(); foreach (DriveInfo d in drives) { driveChoice.Items.Add(d);

程序遍历目录并将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”

如果!filePath.Contains(“I:\$RECYCLE.BIN”)
如果!filePath.Contains(“I:\$RECYCLE.BIN”)
现在无法让
AllDirectories
选项跳过特定目录或忽略遍历时发生的异常。您将需要手动搜索目录结构并处理发生的错误

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

看起来您需要切换到递归解决方案或其他循环,而不是使用“AllDirectory”。这样,您可以提供一些跳过逻辑

请参阅此链接

这是该页面中的代码片段:

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中要跳过的值。

看起来您需要切换到递归解决方案或其他循环,而不是使用“AllDirectory”。这样,您可以提供一些跳过逻辑

请参阅此链接

这是该页面中的代码片段:

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中要跳过的值。

使用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();
    }

}

使用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();
    }

}

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

 var allDirs = rootDir.GetDirectories("*",SearchOption.TopDirectoryOnly);
 var filteredDirs = allDirs.Where(d=> !d.Name.Equals("System Volume Information") && !d.Name.Equals("$RECYCLE.BIN"));

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

 var allDirs = rootDir.GetDirectories("*",SearchOption.TopDirectoryOnly);
 var filteredDirs = allDirs.Where(d=> !d.Name.Equals("System Volume Information") && !d.Name.Equals("$RECYCLE.BIN"));

您仍然会遇到与上述代码一起抛出的潜在
SecurityException
UnauthorizedAccessException
实例。如果您想跳过安全性不允许您访问的文件夹,我建议将内部
foreach
和递归
DirSearch(d)
块包装在
try{}catch{}
阻止筛选到这些异常。您仍然会遇到潜在的
SecurityException
UnauthorizedAccessException
实例与上述代码一起抛出。如果您想跳过安全性不允许您访问的所有文件夹,我建议将内部
foreach
和递归
DirSearch(d)
块包装在
try{}catch{}
块中,以过滤这些异常。