Skip to content

MS_FileSystem

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

ファイルシステム

概要

Open系のOS(WindowsもLinux)の
バイト・ストリーム系ファイル・システムについての情報を纏めている。

ファイル・システム

FAT

移行メモ(補足): 上記の数値は FAT32 のもの (ファイル最大 4GB−1、ボリュームは Windows のフォーマット UI 上の制限が 32GB。 FAT32 の仕様自体は 2TB まで扱える)。 FAT16 はファイル・ボリュームとも 2GB が上限。 なお 4GB 超のファイルを扱いたい場合の後継は exFAT

NTFS

移行メモ(正誤): 「制限無し」は実務上そう見えるという趣旨と解されるが、 正確には上限がある。クラスタ サイズ 4KB の既定では ファイル・ボリュームとも 16TB、64KB クラスタなら 256TB。 Windows Server 2019 / Windows 10 以降は最大 8PB まで拡張されている。

※ このほか、Windows Server 2012 以降では耐障害性を重視した ReFS も選択できる (ただし NTFS の機能をすべて備えるわけではない)。

デフラグ

Linuxにデフラグが無い理由

理由は簡単で、Unix、Linuxでは2つのデータ・ファイルは、
初めから離れた別の場所に格納されるためのようです。

上記から明らかですが、Windowsでは、
更新(追記)を重ねると断片化が進んでしまいそうです。

コメント欄を確認すると、トレード・オフもありそうです。

※ SSD ではシーク時間が無く、書き込み回数の増加が寿命に響くため、 デフラグ(最適化)は行わず TRIM を発行する。 Windows の「ドライブのデフラグと最適化」は、SSD を自動判別して TRIM に切り替える。

断片化と使用領域

セクタ単位なので、断片化は使用領域(空き領域)に関係ないようです。

2GB、4GB制限

Windowsの制限ではない。

Win32APIのSetFilePointer には、

  • LONG lDistanceToMove — ポインタを移動するべきバイト数
  • PLONG lpDistanceToMoveHigh — ポインタを移動するべきバイト数(上位)

の引数が用意されており、APIのI/F上は、
64bitまでのファイルを扱うことが出来る。

移行メモ(正誤): 原文は「64bit(4^32GB)まで」と記載していたが、 この表記は意味をなさない。lpDistanceToMoveHigh と併用した場合の オフセットは符号付き 64bit のため、実際の上限は 2^63−1 バイト(約 8EB)

4GB制限

上記APIの lpDistanceToMoveHigh を使用していないアプリケーションには、4GB制限がある。

  • IE7にも、この4GB制限があるもよう。
  • FAT32にも4GB制限があるが、こちらは
    上記のAPIではなく、もともとの仕様に制限がある。

2GB制限(VB6)

VB6は、上記の lDistanceToMove に渡る引数が 32bit 符号付き(VB6 の Long 型)であったため、2GB制限がある。
# もともと、VBがでたての頃のファイルシステムがFAT16(最大サイズ:2GB)であったため。

IE6にも、この2GB制限があるもよう。

移行メモ(正誤): 原文は「引数が、Integer 型であったため」としていたが、 VB6 の Integer は 16bit(±32,767)で 2GB にはならない。 Win32 の LONG(32bit)に対応する VB6 の型は Long であり、 符号付き 32bit の上限 2^31−1 = 約 2GB が制限の根拠。

その他

Windows的なRAWデバイス

CreateFile等のAPIを使用し、ドライブを直接Openできる。
ただし、OSがロックしているので大概エラーになる。

ファイル・サイズとディスク使用領域の不一致

MS_FileSizeVsDiskUsage.md

ファイルやパスの文字列長と文字コードの問題

MS_PathLengthAndEncoding.md

参考

Wikipedia


Tags: インフラストラクチャ, Windows

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally