1

C:\$Recycle.binファイル列挙でパスを除外しようとしています。これどうやってするの?

var files = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).OrderBy(p => p).ToList();

上記を実行すると、以下のエラーが発生します。

追加情報: パス 'C:\$Recycle.Bin\S-1-5-21-1600837348-2291285090-976156579-500' へのアクセスが拒否されました。

また、すべてのファイルの md5 を計算したいと考えています。私は持っている:

                    var mainDirectory = new DirectoryInfo("\\");

                    var files = GetDirectories(mainDirectory);
                    List<string> drives = new List<string>();

                    foreach (var file in files)
                    {
                        //Console.WriteLine(file.Name);
                        drives.Add(mainDirectory + file.Name);
                    }

                    MD5 md5 = MD5.Create();

                    foreach (string file in drives)
                    {
                        // hash path
                        string relativePath = file.Substring("\\".Length + 1);
                        byte[] pathBytes = Encoding.UTF8.GetBytes(relativePath.ToLower());
                        md5.TransformBlock(pathBytes, 0, pathBytes.Length, pathBytes, 0);

                        // hash contents
                        try
                        {
                            byte[] contentBytes = File.ReadAllBytes(file);

                            md5.TransformBlock(contentBytes, 0, contentBytes.Length, contentBytes, 0);
                            md5.TransformFinalBlock(contentBytes, 0, contentBytes.Length);
                        }
                        catch(UnauthorizedAccessException)
                        {
                            continue;
                        }
                        catch 
                        {
                            continue;
                        } 

                        Console.WriteLine(BitConverter.ToString(md5.Hash).Replace("-", "").ToLower());
                    }
                    Console.ReadKey();
4

1 に答える 1

1

次の方法でそれを行うことができますが、例外を処理しないため、これは手早く汚い方法です。私は可読性を考慮しておらず、完全にはテストされていません。

    static void Main(string[] args)
    {
        var mainDirectory = new DirectoryInfo("C:\\");
        var files = GetFiles(mainDirectory, ".");
        foreach (var file in files)
        {
            Console.WriteLine(file.Name);
        }
        Console.ReadKey();
    }

    static IEnumerable<DirectoryInfo> GetDirectories(DirectoryInfo parentDirectory)
    {
        DirectoryInfo[] childDirectories = null;
        try
        {
            childDirectories = parentDirectory.GetDirectories();
        }
        catch (Exception)
        {

        }
        yield return parentDirectory;
        if (childDirectories != null)
        {
            foreach (var childDirectory in childDirectories)
            {
                var childDirectories2 = GetDirectories(childDirectory);
                foreach (var childDirectory2 in childDirectories2)
                {
                    yield return childDirectory2;
                }
            }
        }
    }

    static IEnumerable<FileInfo> GetFiles(DirectoryInfo parentDirectory, 
                                          string searchPattern)
    {
        var directories = GetDirectories(parentDirectory);
        foreach (var directory in directories)
        {
            FileInfo[] files = null;
            try
            {
                files = directory.GetFiles(searchPattern);
            }
            catch (Exception)
            {
            }
            if (files != null)
            {
                foreach (var file in files)
                {
                    yield return file;
                }
            }
        }
    }
于 2013-10-31T19:52:16.560 に答える