1

ディレクトリとその中のすべてのファイルのサイズをカウントする簡単な方法があります。コードは次のとおりです。

using System;
using System.IO;

namespace MyProject.Libs
{
    public sealed class DirectorySize
    {
        public static long GetDirectorySize(DirectoryInfo dir)
        {
            long total = 0;

            FileInfo[] fileInfos = dir.GetFiles();
            foreach (FileInfo fileInfo in fileInfos)
            {
                total += fileInfo.Length;
            }

            DirectoryInfo[] dirInfos = dir.GetDirectories();
            foreach (DirectoryInfo dirInfo in dirInfos)
            {
                total += DirectorySize.GetDirectorySize(dirInfo);
            }

            return total;
        }
    }
}

ドライブ c:\ で使用すると、「パス 'C:\Documents and Settings' へのアクセスが拒否されました」というメッセージとともに「UnauthorizedAccessException」が発生します。あれは:

DirectoryInfo di = new DirectoryInfo(Path.GetPathRoot(Environment.SystemDirectory));
long ds = DirectorySize.GetDirectorySize(di);

Visual Studio を管理者として実行しようとしました。すべて同じです。なんで?

4

3 に答える 3

3

管理者であっても、アクセス権限のないファイルやフォルダーがあります。あなたができる最善のことは、いくつかの例外処理を追加し、返される情報が十分に完全であることを期待することです.

于 2012-12-28T22:06:18.013 に答える
2

コードが失敗し、C:\Documents and Settingsこれがを指すジャンクションポイントになりC:\Usersます。FileAttributes.ReparsePointディレクトリので確認できます。

例外処理が追加された変更されたコードは次のとおりです(許可されていない他のdirの場合)。

public sealed class DirectorySize
{
    public static long GetDirectorySize(DirectoryInfo dir)
    {
        long total = 0;
        FileAttributes attributes = File.GetAttributes(dir.FullName);
        if (!((attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint))
        {
            try{
                FileInfo[] fileInfos = dir.GetFiles();
                foreach (FileInfo fileInfo in fileInfos)
                {
                    total += fileInfo.Length;
                }

                DirectoryInfo[] dirInfos = dir.GetDirectories();
                foreach (DirectoryInfo dirInfo in dirInfos)
                {
                    total += DirectorySize.GetDirectorySize(dirInfo);
                }
            } catch (UnauthorizedAccessException)
            { 
                // log this?
            }
        }

        return total;
    }
}

ジャンクションポイント(Windows)

WindowsVistaおよびWindowsServer2008では、ユーザーデータとシステムデータのデフォルトの場所が変更されました。たとえば、以前は%SystemDrive%\ Documents and Settingsディレクトリに保存されていたユーザーデータが、%SystemDrive%\Usersディレクトリに保存されるようになりました。下位互換性のために、古い場所には新しい場所を指すジャンクションポイントがあります。たとえば、C:\ Documents and Settingsは、 C:\Usersを指すジャンクションポイントになりました。バックアップアプリケーションは、ジャンクションポイントをバックアップおよび復元できる必要があります。これらのジャンクションポイントは、次のように識別できます 。FILE_ATTRIBUTE_REPARSE_POINTがあります。、FILE_ATTRIBUTE_HIDDEN、およびFILE_ATTRIBUTE_SYSTEMファイル属性が設定されています。また、すべてのユーザーへの読み取りアクセスを拒否するようにアクセス制御リスト(ACL)が設定されています。特定のパスを呼び出すアプリケーションは、必要な権限がある場合、これらのジャンクションポイントを通過できます。ただし、ジャンクションポイントの内容を列挙しようとすると、失敗します。

于 2012-12-28T22:25:16.183 に答える
0

管理者でさえアクセスする権限がないフォルダがいくつかあります。これはほとんどの場合、翻訳されたシステムで発生します。たとえば、「program files」フォルダはドイツ語で「programme」と呼ばれます。コード内の「プログラム」にはアクセスできませんが、「プログラムファイル」にはアクセスできます

于 2012-12-28T22:03:22.847 に答える