Streamはその種類やコンストラクタでの設定によって書き込み可能か、読み込み可能か異なります。 Streamが書き込み可能かどうかといったケーパビリティを実行時に知るには、CanRead・CanWrite・CanSeekの各プロパティを参照します。
次の例は、様々な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の取得については自プロセスの標準入出力 §.標準ストリームの取得で詳しく解説しています。