使C#搜索硬盘驱动器排除目录
程序遍历目录并将Avi文件打印到文本框使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);
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{}
块中,以过滤这些异常。