• ベストアンサー

ファイルのサイズについて

素朴な疑問なんですが、 OSはHD上のファイルのサイズをどのようにして認識しているのでしょうか? ファイルにヘッダみたいなのがあってそれを元に算出しているのですか? あるいはHD上で実際に占めている領域を計算しているのですか? 算出方法はすべてのOSで共通なのでしょうか? また、OSにファイルのサイズを偽って認識させることは可能でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

いろいろな方法がありますが、ごく大雑把に言えば、OSはそれぞれのファイルについて 「このファイルの大きさは、このくらいです」 という情報がHDDのどこかに記録し、またそれを読み出すことでファイルの大きさを認識します。 これより詳しくはOS(より正確にはファイルを格納するHDD上のデータ構造:これをファイルシステムと呼びます)に依存することなので一概には言えません。たとえばセクタの大きさや数を基本としたものや、各ファイルの(論理的な)先頭にヘッダとして情報を持つもの等があります。 「ファイルのサイズを偽って認識させる」とは具体的にどういう状態を指すのか分かりませんが、「OSがHDDに書き込んだファイル長に関する情報」を「OSによるファイル操作」以外の方法を用いて書き換えることは、多くの場合可能です。

minimax2005
質問者

お礼

回答ありがとうございます。 質問に書いた「ファイルのサイズを偽って認識させる」とは、たとえば実際は3キロバイトのデータを5メガバイトに偽装できるのか?ということです。 ヘッダにファイルのサイズを記録するようなファイルシステムの場合は、同じファイルシステムのHDに偽装したファイルを転送した場合でも、サイズが偽装されたままになるのでしょうか? また、違うファイルシステムの場合はやはり偽装が解除されるのでしょうか?

その他の回答 (5)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.6

FATの場合はディレクトリエントリを使いますが、他の多くのファイルシステムではファイルを作るたびに1ブロック(クラスタ)をそのファイルの管理領域に割り当て、管理領域にはファイルサイズ、使用ブロック数、作成・変更・アクセス日時、使用しているブロックのリストなどが記録されます。 OSの保護を掻い潜ってファイルサイズ情報を書き換えれば誤認識させることは可能でしょうが、他の情報との間に矛盾が生じるので何らかのタイミングでOSがチェックすれば分かります。 ただ大きく見せるだけならファイルの後ろにダミーデータを付加すればすみますけどね。これだとファイルシステム的には矛盾ないのでエラーチェックもされませんし。

minimax2005
質問者

お礼

回答ありがとうございます。 ディレクトリエントリと管理領域は違うものだったんですね。 >ダミーデータを付加すればすみますけどね。 たしかにそうですね。 でも小さく見せるには、書き換えるしかないですね。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.5

> 質問に書いた「ファイルのサイズを偽って認識させる」とは、たとえば実際は3キロバイトのデータを5メガバイトに偽装できるのか?ということです。 大昔のMS-DOS時代のファイルシステム(FAT16)では可能でした。 その名の通り、FAT(File Allocation Table)にファイルサイズが書き込まれていたので、DOSのDEBUGか何かで書き換えて遊んだ記憶があります。 > 算出方法はすべてのOSで共通なのでしょうか? OSとファイルシステムごとに異なります。 例えば、同じWindows98でもFAT16とFAT32、更には同じFAT32でもクラスタのサイズによって変わっていたハズ。 1バイトのファイルを作って、ディスク上のサイズが何バイトになるか?とか。

minimax2005
質問者

お礼

回答ありがとうございます。 昔はできたんですか~。 知らなかったです。 >同じFAT32でもクラスタのサイズによって変わっていた なるほど効率的になるように考えられているんですね。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.4

ヘッダにファイルのサイズを記録するようなファイルシステムの場合、そのヘッダの「ファイルのサイズ」を記録している場所のデータ(値)を書き換えることは、多くの場合、可能です。 その書き換えによりどのような影響が生じるかは、ファイルシステムとOSによって異なるので一概には言えません。例えばファイルシステム内の他の部分に記録されているデータとの整合性をチェックし異常があるものと判断して何らかの対応措置を行うかもしれませんし、何ら整合性のチェックを行わず上書きされたファイルサイズのファイルがあるものとしてゴミデータを読み出してしまうかもしれません。

minimax2005
質問者

お礼

回答ありがとうございます。 サイズを書き換えてもファイルを移動する場合は実用的じゃないのですね。

  • char2nd
  • ベストアンサー率34% (2685/7757)
回答No.2

 HDDは使用する前にフォーマットという作業を行います。これは、ディスクにいくつかの細かい区切りを設け(これをセクタといいます)、そのセクタを管理するための領域を作成する事を言います。 http://e-words.jp/w/E38395E382A9E383BCE3839EE38383E38388.html  HDDにファイルを書き込こうとすると、HDD上のセクタに記録します。管理領域には、どのファイルがどこのセクタに書き込まれたかが記録されます。ファイルの大きさによっては、複数のセクタを使います。従って、使用したセクタの数からそのファイルのサイズが判ります。一つのセクタには複数のファイルは書き込まれません。  セクタの大きさや構成はファイルシステムやOSによって違います。

minimax2005
質問者

お礼

回答ありがとうございます。 管理領域というのは、No.1さんがおっしゃっていたディレクトリエントリと同一のものなんでしょうか? 実際にファイルサイズの書き換えを行うときは、管理領域に記録されている使用したセクタのデータを書き換えるのですか? No.1さんが書き換えるとファイルが壊れる場合があると説明されていましたが、これは例えば 「ファイルA(セクタ1~3)とB(4~8)が連続するセクタに記録されていた場合に、Aのサイズを拡張して1~5と書き換えたら、ファイルAにアクセスする際にBの領域にまでアクセスされてしまうからAもBも壊れてしまう。逆にAを縮小して1~2とした場合にはAだけが壊れる」 という解釈でいいんでしょうか? また、書き換えた内容を元に戻すと、壊れたファイルを修復できるんでしょうか?

  • OsieteG00
  • ベストアンサー率35% (777/2173)
回答No.1

Windowsで使われているFATでいうと、ディレクトリエントリとFATの2つにデータが格納されています。ファイル名やファイルサイズ、格納場所がディレクトリエントリに保存されています。OSなどで表示するファイルサイズはこの情報を元に算出されています。 もちろん、このデータだけ書き換えれば偽装は可能です。可能ですが、実際にファイルにアクセスした段階で壊れる可能性があります。 基本的には、どのOSでもこのような形式で算出している場合が多いのではないでしょうか?汎用機でいうVTOCなんかもそうだと思います。実際に書き込んでいるファイルを読み込むことは、処理時間から言うと無茶です。HDDの残り容量を表示するだけでディスクをフルスキャンでウン十分単位^^

参考URL:
http://support.microsoft.com/default.aspx?scid=kb;ja;100108
minimax2005
質問者

お礼

回答ありがとうございます。 ディレクトリエントリにサイズや更新日などのファイル情報が記録されているんですね。 これを書き換えるとどうして、ファイルが壊れてしまうんでしょうか? >HDDの残り容量を表示するだけでディスクをフルスキャンでウン十分単位^^ いわれて見ればそうですね。 ファイルの使用領域の計算は案外時間がかかるものなんですね。

関連するQ&A