ファイル (コンピュータ)
コンピュータにおけるファイル（英: file）は、コンピュータでデータを扱いやすくするための仕組み。場合によってはデータセット（英: data set）とも呼ばれる。
概要
ファイルはデータのやりとりを行うための統一的な仕組みである。言い換えるとファイルはセンサやプリンターなどの外部装置（周辺機器などが該当する）、あるいは他のプログラムへ動的なデータの入出力を行う（パイプを参照のこと）ためのものである。ファイルはハードディスクやUSBメモリなどの記憶媒体にデータを保存するためだけのものだと捉えられがちであるが、記憶媒体への入出力も記憶媒体という装置への入出力に過ぎない。他にもディレクトリをサポートするファイルシステムでは、ディレクトリはファイルを格納するためのファイルとみなすことができ、インターネットを実現するために重要なソケットもファイルに抽象化されているなど、多様な利用の形態がある。
かつてのパンチカードのような紙媒体、あるいは磁気テープといったシーケンシャルアクセスに強い媒体では連続した領域にデータを書き込むことが一般的であったが、近年のファイルシステムは磁気ディスクなどがもつランダムアクセス性を活かして不連続な領域にわたってデータを保存すること（フラグメンテーション）が多い。これは、アクセス速度が遅くなる代わりに無駄になる領域を減らし、より多くのデータを格納することに繋がる。ファイルにはアプリケーションが作成したデータの他に、ファイル名や様々な属性があり、この属性はファイルシステムに依存する。
ファイルの中に入れるデータの種類もさまざまである。例えばコンピュータプログラムが入ったファイルがあり、これをプログラムファイルと呼ぶ。同様に、データベースファイル、文書ファイル、表計算ファイル、画像ファイル、音楽ファイル、動画ファイルなどがある。これらをファイルフォーマットと呼ぶ。
歴史
「ファイル」という言葉がコンピュータの記憶装置に関連する用語として使われ始めたのは1952年で、当初はパンチカードに格納された情報を指した言葉だった。初期のころは格納されている中身の情報よりも、装置自体をファイルと呼ぶことが多かった。例えば、IBM 350 のディスク装置は「ディスクファイル」と呼ばれていた。
1962年のCTSSではファイルシステム機能があり、1つの補助記憶装置上に複数の「ファイル」が存在するという形態が登場した。これが現代的な意味でのファイルの始まりである。CTSSではファイル名が2つの部分で構成されていた。1つはユーザーが読めるプライマリ名で、セカンダリ名はファイルの種類を表していた。このようなファイル名の構成方法は Microsoft Windows などの現代のオペレーティングシステムにも受け継がれている。
古い用法（情報を格納するものを「ファイル」と呼ぶ使い方）はほとんど見られなくなったが、例えばレジスタの集まりをレジスタファイルと呼ぶのは古い用法の名残である。
ファイルの概念
非常にシンプルな基本的な構成のコンピュータではファイルというものはない。使用時に手入力というものもある。これを再利用可能とするため、一度に取り扱うデータを外部の記憶媒体にアウトプットした集まりがファイルである。コンピュータのファイルはそれぞれ各アプリケーションが作成し使用するデータであるため、ファイルとはアプリケーションが認識すればよく、従来型の多くのコンピュータでは使用するアプリケーションを選択してから、そのアプリケーションで使用するデータのファイルを指定した。
しかし、オブジェクト指向の考え方を導入し使用者を中心においたアップルのMacintoshにおいて、ファイルの取扱いにリソースの概念が取り入れられた。ファイル内にデータとともにリソースを保管したことで、ファイル作成後は、そのファイルを選択すれば（たとえばGUI画面上でファイルを選択するためダブルクリックすれば）、オペレーティングシステムによって最適なアプリケーションが選択される（起動される）ようになった。一般的なパソコン利用者には、どんなアプリケーションで作ったかを事前に思い出すことなく、作成済みのファイルの名前さえ識別して選択すれば、適切なソフトウェアが起動されるようになり、これにより使い勝手が向上した。後、Windowsにおいてこのリソースの概念は使用者には「拡張子によるアプリケーションの関連づけ」として提示されるものとして知られる。
ファイルの区分
ファイルの区分のひとつに、バイナリファイルとテキストファイルに大別する考え方がある。この2大区分の考え方の基礎には、データをすべてバイナリファイルとして取り扱うUNIXにおいて、文字情報だけのテキスト情報を識別する意味があり、UNIXの考え方を引き継いだ個人利用用コンピュータオペレーティングシステムのDOSやWindows、Macintoshなどでもこの考え方が適用されている。
バイナリファイルとは、コンピュータ内部でプログラムが直接処理するデータ（ビット列）をそのまま格納するものでそのビット列の意味するものは、各アプリケーションソフト毎に異なる。一方、テキストファイルとは、そのビット列がある基準で制定された文字コードに従ったビット列が格納されているものである。テキストファイルとはある基準の文字コード（ビット列）のみで構成されたバイナリファイルと同じもので、バイナリファイルの一種を特別扱いしている。テキストファイルはそのデータビット列定義が文字情報という広く使われる情報であるため、いいかえれば、バイナリファイルは、データビット列定義が各アプリケーション固有、一方、テキストファイルは標準化されたビット列定義を持っているファイル、となる。
文字情報だけを取り扱うテキストエディタ等（Windowsでは「メモ帳」等）バイナリファイルはいわゆる「文字化け」を起こすのに対して、テキストファイルは（当然ながら）一定の文字列となって表示される。今日、広く利用されているワープロソフトで作成された文章ファイルは、文字情報だけでなく、文字の大きさ、色、列情報、ページ情報、などさまざまな固有データをとりあつかうもので、そのファイル形式はバイナリファイルの一種となる。
ここでのテキストデータとは、あいうえおの「あ」や「い」そのものしかあらわさない。「あ」の文字の大きさ、フォント、字形、「い」の色などは含まない。しかし、「改行」や「空白」などは含まれる。タイプライターの時代の文字の概念がコンピュータ化されたもの。
バイナリファイルは、アプリケーションが固有に定義したデータ列であるが、業界で標準化されたデータ形式を含んだものもある。また、アプリケーションが稼動するオペレーティングシステムで標準化された構造となっていることもある。
たとえば、ファイルの先頭部分（あるいは末尾部分）など、それぞれに定義された場所に定義されたデータを含む。これらの情報を参照し、データ種別や、データのフォーマット、そのバージョンなどを判断する。データが自分が作ったものでない場合、パソコンに既に導入されているソフトウェアで開けるかどうか確認する場合など。
バイナリファイルをビット列として扱うソフトウェアとしてビット列を直接編集する（これを「低レベル」と表現する）ソフトウェアがある。これはバイナリエディタと呼ばれる。（「絵を描く」など人間の動作に近いことを行うアプリケーションを「高レベル」、「ビットをオンオフする」などコンピュータよりの仕事を行うアプリケーションを「低レベル」と呼ぶ。これは、アプリケーションプログラム作成のレベルを表すこともあるが、その仕事がすばらしいかどうかということを常に高低付けし価値付けしているというものでもなく、「単に習慣的にそう呼ぶ」場合も多い。）
バイナリファイルもテキストファイルも一般的には使用時にその全体がアプリケーションに読み込まれ使用されるものであるが、データが大量になれば、一度に全体を読み込むことはプログラムにとってもハードウェアにとっても大きな損失となる。そのため、必要なときに必要なデータだけをダイナミックに提供できるようなファイルシステムとしてファイルをより構造化したデータベースが作られるようになった。
ファイルの保護
最近のコンピュータでは、ファイルを誤って（または故意に）書き換えたり削除したりといったことから保護する方法が備わっている。マルチユーザー環境では、ファイルパーミッションによって、誰がそのファイルを修正したり削除したり、あるいはファイルやフォルダーを作成したりできるかを規定している。これにより、特定のユーザーだけがファイルやフォルダーを作成したり修正したりできるよう設定したり、特定のユーザーだけが中身を読めるように設定したりできる。
もう1つの保護機構としてよく使われるのは、「リードオンリー」フラグを使う方法である。ファイルに対してこのフラグを立てると、ファイルの内容を読み込むことはできるが、書き換えることはできなくなる。これは変更されたり消去されたりすると困る重要な情報を保護するのに便利で、システムファイルなどの保護に使われる。システムによっては「隠し属性」フラグも持っていて、指定したファイルを（通常の手段では）見えないようにできる。これもユーザーに書き換えられると困るシステムファイルを隠すのに使われる。
ファイルの格納
ファイルはユーザーから見た概念的存在であると同時に、物理的な実体を伴う。すなわち、実際のコンピュータにおけるファイルには必ず物理的実体が存在する。多くの場合、ファイルは何らかの記憶装置に格納されている。例えば、多くのオペレーティングシステムはファイルを格納する装置としてハードディスクドライブを使用しており、最も一般的な不揮発性記憶装置になっている。一時的な情報を格納するだけのファイルは、揮発性のRAM上に格納することもある。
Unix系OSでは、実際の記憶装置に対応していないファイルも数多く存在する。/dev/null など、/dev 配下のファイルや /proc や /sys 配下のファイルがそれに当たる。これらはユーザーからはファイルとしてアクセスできるが、実際にはOSのカーネル内のオブジェクトとして存在する仮想ファイルである。
ファイルを格納する電子媒体としては、磁気テープもある。他にも書き込み可能なコンパクトディスク、DVD、ZIP、USBメモリなどにも格納できる。
コンピュータ側から見たファイル
コンピュータ側では、幾つかの段階を経て、画面上にデータの一つの塊として表示しているが、これをよりコンピュータ側からの視点で見た場合に、幾つものデータを寄せ集めて一つに見せている事もある。
ハードディスクはこれらファイルを保存しておくための記憶装置だが、この中にはトラックやセクター（更にはクラスタ）と呼ばれる細かい区分が用意されており、この細かい区分複数個に跨って情報が格納される。丁度何巻にも分かれている大作長編小説のように区分けされて保管された情報は、更に突き詰めればビットと呼ばれるON/OFFの関係にある点（スイッチ）の集合であるが、これらはコンピュータの基礎部分のプログラムやOSのファイルシステムによって制御され、最終的に一つのファイルの形で画面上に表示されている。
フラグメンテーション
特に長期間使っているハードディスクでは、コンピュータは情報を書き込む際に、空いている場所に随時書き込むように設計されているが、扱うデータが一定のサイズではないため、何度も書いたり消したりと言った操作を繰り返す内に、フラグメンテーションと呼ばれる現象が発生する。この現象は、例えるなら前出の長編小説の1巻が本棚右上・2巻が左隅・3巻が中央…といった具合である。
だがコンピュータの誤動作等により、この細かい区分を統合するための情報が損なわれた場合に、これら情報を正確に統合して利用者に提供する事が出来なくなる。前出の長編小説で更に例えるなら「五巻が何処に行ったか見当たらない」というような状態だ。このようなファイル破損では、自動的に復旧するツールもあるが、その機能も絶対ではなく、特にOSのプログラムファイルが破損したり、設定ファイルが呼び出せなくなった場合には、致命的な問題が発生する。
なおコンピュータのファイルは、基本的に複製を作る事が非常に容易い。破損して困るデータは、積極的にバックアップを取る事が勧められる。
バックアップ
非常に重要な情報を含むファイルを破壊するような障害や災害から守るには、バックアップを行う。バックアップとは、ファイルの複製を作ることであり、それを別の場所に保管することで、ファイルを誤って削除した場合などに復旧できるようにする。
バックアップ方法は様々である。ほとんどのコンピュータシステムにはバックアップ用のユーティリティプログラムが備わっているが、多数のファイルをバックアップする作業は時間がかかる。一般に書き込み可能なCDや磁気テープにバックアップを保管する。同じコンピュータシステム内の別のディスク装置にコピーした場合、元のディスク装置の障害に対しては復旧可能だが、システム全体が火事で消失するなどの災害時には役に立たない。そのため、本当に重要なファイルは別媒体にバックアップし、それを別の場所に保管すべきである。
ファイルシステムとファイルマネージャ
コンピュータがファイルを構成し、命名し、格納し、操作する体系を一般にファイルシステムと呼ぶ。ほとんどのコンピュータには少なくとも1つのファイルシステムがある。中には、いくつかの異なる種類のファイルシステムが使えるものもある。例えばWindowsでは、MS-DOSの時代から使われているFATに加えて、NTFSがあり、最近では後者がデフォルトになっている。ファイルシステムにはそれぞれに利点と欠点がある。標準のFATではファイル名は8文字まで（それに加えて拡張子が3文字）で、空白文字をファイル名に含めることもできない。これに対してNTFSではもっと長いファイル名を付けることができ、空白文字も使える。例えば、NTFSではPayroll recordsというファイル名を付けられるが、FATではpayroll.datなどとなる（ただし、FATにも長いファイル名を使える拡張が存在する）。
ファイルマネージャとは、ユーザーがファイルを直接操作できるようにしたユーティリティプログラムである。ファイルやフォルダーを移動・作成・削除・改名できるが、ファイルの中身を完全に閲覧することはできない。コンピュータシステムにはほぼ必ずファイルマネージャが存在する。Windowsの場合は標準のWindows Explorerがよく使われている。