2012年11月21日水曜日

フォルダ内のファイルサイズの合計を調べる

サブディレクトリを含むディレクトリ内のすべてのファイルのパスは、Directory.GetFiles メソッド (String, String, SearchOption) でSearchOptionにAllDirectoriesを指定して取得できますが、ここでは再帰的にサブディレクトリをたどってファイルサイズを調べています。

DirectoryInfo.GetDirectoriesメソッドで返されるサブディレクトリには、リパースポイントも含まれます。
さらにそのリパースポイントのGetDirectoriesメソッドを実行すると、UnauthorizedAccessExceptionが発生します。
よって、サブディレクトリからリパースポイントを除くために、FileAttributes.ReparsePointのフラグがたっているかどうかをチェックしています。




MainWindow.xaml

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="250" Width="425">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <DockPanel Grid.Row="0" LastChildFill="True">
            <Button DockPanel.Dock="Right" Click="Button_Click">Get</Button>
            <TextBox DockPanel.Dock="Right" Name="dirTextBox"/>
        </DockPanel>
        <TextBox Grid.Row="1" Name="textBox1" />
    </Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Diagnostics;
using System.IO;
using System.Windows;

namespace WpfApplication8
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                DirectoryInfo dirInfo = new DirectoryInfo(this.dirTextBox.Text);
                long size = GetSize(dirInfo);
                sw.Stop();
                this.textBox1.Text = size + "\n" + sw.Elapsed;
            }
            catch (Exception exception)
            {
                this.textBox1.Text = exception.Message;
            }
        }

        private static long GetSize(DirectoryInfo dirInfo)
        {
            long size = 0;
            FileInfo[] fileInfos = dirInfo.GetFiles();
            foreach (FileInfo fileInfo in fileInfos)
            {
                size += fileInfo.Length;
            }
            DirectoryInfo[] subDirInfos = dirInfo.GetDirectories();
            foreach (DirectoryInfo subDirInfo in subDirInfos)
            {
                if ((subDirInfo.Attributes & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)
                {
                    size += GetSize(subDirInfo);
                }
            }
            return size;
        }
    }
}

0 件のコメント:

コメントを投稿