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 件のコメント:
コメントを投稿