Streamはその種類やコンストラクタでの設定によって書き込み可能か、読み込み可能か異なります。 Streamが書き込み可能かどうかといったケーパビリティを実行時に知るには、CanReadCanWriteCanSeekの各プロパティを参照します。

次の例は、様々なStreamに対してそのケーパビリティを調べた例です。

ストリームが読み込み可能・書き込み可能・シーク可能か調べる
using System;
using System.IO;

class Sample {
  static void PrintStreamCapability(Stream stream)
  {
    Console.WriteLine("CanRead  : {0}", stream.CanRead);
    Console.WriteLine("CanWrite : {0}", stream.CanWrite);
    Console.WriteLine("CanSeek  : {0}", stream.CanSeek);
  }

  static void Main()
  {
    // 読み込み用に開いたFileStream
    Console.WriteLine("[File.OpenRead]");
    using (var stream = File.OpenRead("sample.dat")) {
      PrintStreamCapability(stream);
    }

    // 書き込み用に開いたFileStream
    Console.WriteLine("[File.OpenWrite]");
    using (var stream = File.OpenWrite("sample.dat")) {
      PrintStreamCapability(stream);
    }

    // 書き込み可能なMemoryStream
    Console.WriteLine("[MemoryStream]");
    using (var stream = new MemoryStream()) {
      PrintStreamCapability(stream);
    }

    // 読み込み専用のMemoryStream
    Console.WriteLine("[MemoryStream (read only)]");
    using (var stream = new MemoryStream(new byte[8], false)) {
      PrintStreamCapability(stream);
    }

    // 標準入力のStream
    Console.WriteLine("[Console.OpenStandardInput]");
    using (var stream = Console.OpenStandardInput()) {
      PrintStreamCapability(stream);
    }

    // 標準出力のStream
    Console.WriteLine("[Console.OpenStandardOutput]");
    using (var stream = Console.OpenStandardOutput()) {
      PrintStreamCapability(stream);
    }
  }
}
実行結果
[File.OpenRead]
CanRead  : True
CanWrite : False
CanSeek  : True
[File.OpenWrite]
CanRead  : False
CanWrite : True
CanSeek  : True
[MemoryStream]
CanRead  : True
CanWrite : True
CanSeek  : True
[MemoryStream (read only)]
CanRead  : True
CanWrite : False
CanSeek  : True
[Console.OpenStandardInput]
CanRead  : True
CanWrite : False
CanSeek  : False
[Console.OpenStandardOutput]
CanRead  : False
CanWrite : True
CanSeek  : False

各ケーパビリティと、該当する操作のメソッド・プロパティは次のとおりです。

各ケーパビリティと該当する操作
ケーパビリティのプロパティ 該当するStreamの操作
CanWrite Write, WriteByte, Flush, SetLength
CanRead Read, ReadByte
CanSeek Seek, SetLength, Position(プロパティの設定)

ケーパビリティがfalseになっている操作を行おうとすると、例外NotSupportedExceptionがスローされます。 例えば、CanSeekがfalseのStreamに対してSeekメソッドやSetLengthメソッドを呼び出そうとすると例外エラーとなります。

上記の例で使用している標準入力・標準出力のStreamの取得については自プロセスの標準入出力 §.標準ストリームの取得で詳しく解説しています。