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

ラムダ ステートメントを使用して、システム ディレクトリを除外します。

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

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

于 2013-03-29T19:49:27.280 に答える