2012年11月13日火曜日

Excelなどで開いているファイルを開く

OpenFileDialogでファイルを開いてテキストを表示」の場合、開こうとするファイルをすでにExcelなどで開いていると、
「型 'System.IO.IOException' のハンドルされていない例外が mscorlib.dll で発生しました
追加情報: 別のプロセスで使用されているため、プロセスはファイル '************' にアクセスできません。」
のエラーとなり、ファイルを開けません。

System.IO.FileShare 列挙体の FileShare.ReadWrite を指定して FileStreamクラスのインスタンスを生成すると開けるようになります。

FileStream fs = new FileStream(”test.txt”, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

MainWindow.xaml

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="250" Width="325">
    <Window.CommandBindings>
        <CommandBinding Command="Open" Executed="OpenCommandHandler"/>
    </Window.CommandBindings>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Menu Grid.Row="0">
            <MenuItem Command="Open" />
        </Menu>
        <TextBox Grid.Row="1" Name="textBox1"
                 AcceptsReturn="True"
                 ScrollViewer.VerticalScrollBarVisibility="Auto"
                 ScrollViewer.HorizontalScrollBarVisibility="Auto" />
    </Grid>
</Window>

MainWindow.xaml.cs

using Microsoft.Win32;
using System.IO;
using System.Windows;
using System.Windows.Input;

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

        private void OpenCommandHandler(object sender, ExecutedRoutedEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == true)
            {
                string content;
                using (FileStream fs = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                using (StreamReader sr = new StreamReader(fs))
                {
                    content = sr.ReadToEnd();
                }
                this.textBox1.Text = content;
            }
        }
    }
}

0 件のコメント:

コメントを投稿