ファイルおよびストリーム入出力

ファイルおよびストリーム I/O (入出力) とは、ストレージ メディアとの間のデータの転送を指します。 .NET の System.IO 名前空間には、データ ストリームとファイルに対する、同期的、非同期的両方の読み取りと書き込みを実現する型が含まれています。 これらの名前空間には、ファイルを圧縮および圧縮解除する型、パイプとシリアル ポート経由の通信を有効にする型もあります。

ファイルとは、バイトを順序立てて格納する名前付きのコレクションであり、永続ストレージを保有します。 ファイルを操作するときには、ディレクトリ パス、ディスク ストレージ、ファイル名、ディレクトリ名を操作します。 これに対し、ストリームは、バッキング ストアの読み取りと書き込みに使用できるバイトのシーケンスです。バッキング ストアは、複数のストレージ メディアのいずれかになります (たとえば、ディスク、メモリ)。 ディスク以外にいくつかのバッキング ストアが存在するのと同じように、ファイル ストリーム以外にも、ネットワーク ストリーム、メモリ ストリーム、パイプ ストリームなど、さまざまなストリームが存在します。

ファイルとディレクトリ

System.IO 名前空間の型を使用して、ファイルとディレクトリを操作できます。 たとえば、ファイルとディレクトリに対するプロパティを取得および設定したり、検索条件に基づいて、ファイルとディレクトリのコレクションを取得したりできます。

.NET Core 1.1 以降および .NET Framework 4.6.2 以降でサポートされている DOS デバイスの構文を含む、パスの名前付け規則および Windows システムのファイル パスを表す方法の詳細については、「Windows システムのファイル パスの形式」を参照してください。

一般的なファイルおよびディレクトリのクラスを次に示します。

  • File - ファイルを作成、コピー、削除、移動、およびオープンするための静的メソッドを提供し、FileStream オブジェクトの作成を支援します。

  • FileInfo - ファイルを作成、コピー、削除、移動、およびオープンするためのインスタンス メソッドを提供し、FileStream オブジェクトの作成を支援します。

  • Directory - ディレクトリやサブディレクトリを作成、移動、および反復処理するための静的メソッドを提供します。

  • DirectoryInfo - ディレクトリやサブディレクトリを作成、移動、および反復処理するためのインスタンス メソッドを提供します。

  • Path - 複数のプラットフォームにまたがってディレクトリ文字列を処理するためのメソッドおよびプロパティを提供します。

ファイル システム メソッドを呼び出すときは、常に堅牢な例外処理を用意するようにします。 詳細については、I/O エラーの処理に関するページを参照してください。

これらのクラスに加えて、Visual Basic のユーザーは、ファイル I/O 用の Microsoft.VisualBasic.FileIO.FileSystem クラスに用意されているメソッドとプロパティを使用できます。

方法: ディレクトリをコピーする、「方法: ディレクトリ一覧を作成する」、「方法: ディレクトリとファイルを列挙する

ストリーム

抽象基底クラス Stream は、バイトの読み取りと書き込みをサポートします。 ストリームを表すすべてのクラスは、Stream クラスから継承されます。 Stream クラスとその派生クラスは、データ ソースやリポジトリの共通ビューを提供し、プログラマがオペレーティング システムや基になるデバイスに固有の詳細事項を考慮する必要をなくします。

ストリームには次の 3 つの基本的な操作が含まれます。

  • 読み取り - ストリームからバイト配列などのデータ構造体にデータを転送します。

  • 書き込み - データ ソースからストリームにデータを転送します。

  • シーク - ストリーム内の現在位置を照会および変更します。

基になるデータ ソースまたはリポジトリによっては、ストリームがサポートできる機能が上記の一部に限られる場合があります。 たとえば、PipeStream クラスは、シークをサポートしません。 ストリームの CanReadCanWrite、および CanSeek の各プロパティで、そのストリームがサポートする操作を指定します。

一般的なストリーム クラスを次に示します。

  • FileStream – ファイルの読み取りと書き込みを実行します。

  • IsolatedStorageFileStream – 分離ストレージのファイルの読み取りと書き込みを実行します。

  • MemoryStream – バッキング ストアとしてメモリの読み取りと書き込みを実行します。

  • BufferedStream – 読み取り操作と書き込み操作のパフォーマンスを向上します。

  • NetworkStream – ネットワーク ソケットを介して読み取りと書き込みを実行します。

  • PipeStream – 匿名パイプと名前付きパイプを介して読み取りと書き込みを実行します。

  • CryptoStream – データ ストリームを暗号変換にリンクします。

ストリームを非同期的に操作する例については、「非同期ファイル I/O」を参照してください。

リーダーとライター

System.IO 名前空間には、ストリームからエンコードされた文字を読み取ったり、ストリームに書き込んだりするための型も用意されています。 通常、ストリームはバイトの入出力用に設計されています。 リーダー型とライター型は、ストリームが操作を完了できるように、バイトとの間でエンコードされた文字の変換を処理します。 各リーダー クラスとライター クラスは、クラスの BaseStream プロパティから取得できるストリームに関連付けられます。

一般的なリーダー クラスとライター クラスを次に示します。

  • BinaryReader および BinaryWriter – バイナリ値としてプリミティブ データ型の読み取りと書き込みを実行します。

  • StreamReader および StreamWriter – 文字とバイトを相互変換するエンコーディング値を使用して、文字の読み取りと書き込みを実行します。

  • StringReader および StringWriter – 文字列から文字を読み取り、文字列に文字を書き込みます。

  • TextReader および TextWriter – バイナリ データを除く、文字と文字列の読み取りと書き込みを行う他のリーダーとライターの抽象基底クラスとして機能します。

方法: ファイルからテキストを読み取る」、「方法: ファイルにテキストを書き込む」、「方法: 文字列から文字を読み取る」、「方法: 文字列への文字の書き込み

非同期 I/O 操作

大量のデータを読み取ったり書き込んだりすると、リソースが大量に消費されることがあります。 アプリケーションのユーザーに対する応答性を維持する必要がある場合は、これらのタスクを非同期的に実行する必要があります。 同期 I/O 操作の場合、大量のリソースを消費する操作が完了するまで UI スレッドがブロックされます。 Windows 8.x ストア アプリを開発するときには非同期 I/O 操作を使用して、アプリが動作しなくなったと受け取られないようにします。

CopyToAsyncFlushAsyncReadAsyncWriteAsync の各メソッドのように、非同期メンバーの名前には Async が含まれています。 これらのメソッドは、async キーワードおよび await キーワードと共に使用します。

詳細については、「非同期ファイル I/O」を参照してください。

[圧縮]

圧縮とは、保管するためにファイルのサイズを小さくするプロセスのことです。 圧縮解除は、圧縮ファイルの内容を抽出し、その内容を使用可能な形式にするプロセスです。 System.IO.Compression 名前空間には、ファイルおよびストリームを圧縮および圧縮解除するための型が含まれています。

次のクラスは、ファイルおよびストリームを圧縮および圧縮解除するときによく使用します。

  • ZipArchive – ZIP アーカイブのエントリを作成および取得します。

  • ZipArchiveEntry – 圧縮ファイルを表します。

  • ZipFile – 圧縮パッケージの作成、抽出、およびオープンを行います。

  • ZipFileExtensions – 圧縮パッケージのエントリを作成および抽出します。

  • DeflateStream – Deflate アルゴリズムを使用してストリームを圧縮および圧縮解除します。

  • GZipStream – gzip データ形式のストリームを圧縮および圧縮解除します。

方法:ファイルを圧縮して抽出する

分離ストレージ

分離ストレージは、コードと保存データを関連付ける標準化された方法を定義することにより、分離性と安全性を提供するデータ ストレージ機構です。 ストレージは、ユーザー、アセンブリ、および (必要に応じて) ドメイン別に分離された仮想ファイル システムを提供します。 分離ストレージは、アプリケーションにユーザー ファイルへのアクセス許可がない場合に特に便利です。 コンピューターのセキュリティ ポリシーによって制御される方法でアプリケーションの設定またはファイルを保存できます。

分離ストレージは Windows 8.x ストア アプリには使用できません。代わりに、Windows.Storage 名前空間のアプリケーション データ クラスを使用します。 詳細については、アプリケーション データに関するページをご覧ください。

次のクラスは、分離ストレージを実装するときによく使用します。

  • IsolatedStorage – 分離ストレージの実装の基底クラスを提供します。

  • IsolatedStorageFile – ファイルとディレクトリを格納している分離ストレージ領域を提供します。

  • IsolatedStorageFileStream - 分離ストレージ内のファイルを公開します。

分離ストレージ」を参照してください。

Windows ストア アプリの I/O 操作

Windows 8.x ストア アプリ用 .NET には、ストリームの読み取りと書き込みを行うための型の多くが含まれています。ただし、.NET のすべての I/O 型がこのセットに含まれているわけではありません。

次に、I/O 操作を Windows 8.x ストア アプリで使用する場合に注意する必要がある重要な違いを示します。

必要に応じて、.NET Framework ストリームと Windows ランタイム ストリームを変換できます。 詳しくは、「方法: .NET Framework ストリームと Windows ランタイム ストリームの間で変換を行う」または「WindowsRuntimeStreamExtensions」をご覧ください。

Windows 8.x ストア アプリでの I/O 操作の詳細については、「Quickstart: Reading and writing files」 (クイック スタート: ファイルの読み取りと書き込み) を参照してください。

I/O とセキュリティ

System.IO 名前空間のクラスを使用する場合、アクセス制御リスト (ACL: Access Control List) などのオペレーティング システムのセキュリティ要件に従い、ファイルとディレクトリへのアクセスを制御する必要があります。 この要件の他にも、FileIOPermission で指定されている要件を満たす必要があります。 ACL はプログラムで管理できます。 詳細については、「方法: アクセス制御リスト エントリを追加または削除する」を参照してください。

既定のセキュリティ ポリシーでは、インターネットまたはイントラネットのアプリケーションはユーザーのコンピューター上のファイルにアクセスできません。 したがって、インターネットまたはイントラネットを経由してダウンロードされるコードを記述する場合に、物理ファイルへのパスを必要とする I/O クラスを使用しないでください。 代わりに、.NET アプリケーションで分離ストレージを使用してください。

セキュリティ チェックが実行されるのは、ストリームが構築されている場合だけです。 したがって、ストリームを開いて、そのストリームを信頼度の低いコードやアプリケーション ドメインに渡さないでください。

  • 共通 I/O タスク
    ファイル、ディレクトリ、およびストリームに関連する I/O タスクの一覧、および各タスクの関連するコンテンツと例へのリンクを示します。

  • 非同期ファイル I/O
    非同期 I/O のパフォーマンス上の利点と基本的な操作について説明します。

  • 分離ストレージ
    コードと保存データを関連付ける標準的な方法を定義することにより、分離性と安全性を提供するデータ ストレージ機構について説明します。

  • パイプ
    .NET での匿名および名前付きパイプ操作について説明します。

  • メモリ マップト ファイル
    ディスク上のファイルの内容を仮想メモリ内に格納するメモリ マップト ファイルについて説明します。 メモリ マップト ファイルは、非常に大きなファイルを編集したり、プロセス間通信用の共有メモリを作成したりするために使用できます。