ファイル名
ファイル名(ファイルめい、英: filename)は、コンピュータのファイルシステム中に保存されたファイルを特定するためにつける名前を表す文字列のことである。コンピュータ上で主記憶装置(メインメモリ)にデータとして展開されている作業内容を、補助記憶装置(ストレージ)にファイルとして保存(永続化)するときは、まずファイル名を指定し、その名前を持つファイルを書き込みモードでオープンしてからデータを書き込み、クローズする。一般的には、設定したファイル名は後から何度でも変更(リネーム)可能であるが、システムによってはエンドユーザーによる自由な命名や改名が許可されていない場合もある。ストレージに保存されたファイルの内容をメモリに読み込むときは、そのファイル名を使って読み取りモードでオープンしてからデータを読み取り、クローズする。
文脈によっては、「ファイル名」という用語がファイルの名前だけでなくディレクトリ(フォルダー)の名前(ディレクトリ名、フォルダー名)を包含していることもある[1][2]。さらに、「ファイル名」がファイルパスと同一視され、絶対パスまたは相対パスを含んでいることもあれば[3][4][5]、パス区切り文字(ディレクトリ区切り文字)で分割された最後の要素のみを表すこともある[1][6]。「ファイル名」が拡張子を含むこともあれば、含まないこともある。また、ファイル名の長さや使用可能な文字の制限はオペレーティングシステム (OS) やファイルシステムにより異なる。
ファイル名として解釈される文字列を構成する文字も、OSやファイルシステムにより異なる。Windows NT系では内部的にUnicodeで表される文字からなる文字列(実際のエンコードはUTF-16)を利用しており、NTFSやexFAT、UDFS、FAT32といった比較的新しいファイルシステムではストレージに長いファイル名 (Long File Name, LFN) をUnicodeで格納する[7]。UNIX/Linuxではオクテット列を用いる[要出典]。このため、システムによっては人間にとって読めないファイル名を付けることも可能であり、またシステム間でデータを移動する際は適切な規則でのファイル名の変換が必要となる。
パーソナルコンピュータ (PC) 向けのOSでは、エンドユーザーがファイルマネージャーを利用してある程度自由にファイルやディレクトリを操作できるため、ファイル名を意識する機会も多いが、コンピュータシステムやアプリケーションソフトウェアによっては、ユーザーがファイル名を意識する必要がないこともある。例えばゲームの場合、進行状況などを保存するセーブデータは外付けのメモリカード、内蔵のローカルストレージまたはクラウドサーバーなどに何らかのファイルとして保存されるが、通例ソフトウェアによって管理しやすいファイル名が自動的に付けられる。iPhoneやiPadで使われているモバイルOSのiOS/iPadOSは、バージョン10までファイルマネージャーを標準搭載しておらず[8]、エンドユーザーは普段ファイル名どころかファイルという概念の存在すら意識することはなかった。
ファイル名に含まれる要素
[編集]ファイル名(パス名)には以下のような要素が含まれる場合がある。
- プロトコル(スキームとも)― アクセス方法
- 例:http, ftp, file, smb など
- ホスト(ネットワークIDの場合も)― ホスト名、IPアドレス、ドメイン名、LANネットワーク名
- 例:
wikipedia.org
,207.142.131.206
,\\MYCOMPUTER
,SYS:
など
- 例:
- デバイス(ノードとも)― ポート、ソケット、ドライブ、ルートマウントポイント、ディスク、ボリューム
- 例:
C:
,/
,SYSLIB
など
- 例:
- ディレクトリ(パスとも)― ディレクトリ・ツリー
- 例:
/usr/bin
,\TEMP
,[USR.LIB.SRC]
など
- 例:
- ベースファイル名(英: base file name)またはステム(英: stem)― 拡張子を除いたファイル名[2][9]
- 例:
C:\hoge\fuga.txt
におけるfuga
など
- 例:
- 種類(形式[要説明]や拡張子)― ファイルの内容種別を示す
- 例:
.txt
,.exe
,.dir
,.html
など
- 例:
- バージョン ― ファイルの版を表す番号
POSIXには、パス区切り文字/
で分割された最後の要素を返す「basename」というコマンドおよびシステムコールが存在する[10][11]。これらは拡張子を含むファイル名を返す。コマンドのほうはsuffix
オプションを指定することもでき、例えば.txt
のような拡張子を取り除く用途にも使えるが、任意の拡張子を一律取り除けるわけではない。
Javaではjava.io.File.getName()
またはjava.nio.file.Path.getFileName()
によって、名前区切り文字java.io.File.separatorChar
で分割された最後の要素を取得することができる。
使用が不可能な記号
[編集]たとえ、コンピュータ上で利用可能な記号(例えばテキストファイル内の文字データとして閲覧や編集が可能)でも、ファイル名では使用が不可能な記号がある(「/
」「"
」のような半角の記号は使用不可能だが、「/
」「“
」「”
」のような全角の記号ならば使用可能な場合もある)。ファイルシステムが違うと、同じOSでも使用不可能な記号が異なることがある。これは、ファイルシステムによって予約されており、その記号が何らかのファイル処理に既に利用されているためである。そのため、あるコンピュータでは使用可能でも、他のコンピュータでは使用不可能な場合もある。ファイルシステム側の制約とは直接関係ないものの、OS側の歴史的な経緯から使用不可能となっている記号もある[12]。ファイルマネージャーやコマンドラインインタプリタ(シェル)上では命名に制限がかかっていても、APIによってはそのような制限がかからず、APIを使ったプログラムコードを書いて直接ファイルを作成することができてしまうケースもあるが、そういった標準規則違反のファイル名を付けてしまうとトラブルを引き起こすことが多い。
ファイル名として使用できない記号、および使用が不可能な理由について以下の表に示す。
記号 | 記号名 | 使用が不可能な理由 |
---|---|---|
/
|
スラッシュ | パス名コンポーネント分離符として、UNIXなどのOSやMS-DOSとWindowsでは使用不可能。 |
\
|
バックスラッシュ | パス名コンポーネント分離符として、MS-DOSとWindowsでは使用不可能。 |
?
|
クエスチョンマーク | ワイルドカード(不特定だと示す記号)として使われるため、WindowsとAmigaOSでは使用不可能。 |
*
|
アスタリスク | ワイルドカードとして使用されるため、MS-DOSとWindowsでは使用不可能。 |
:
|
コロン | ドライブレターに使用される、またはパス名分離符であるなどの理由から、Windows、AmigaOS、Mac OSでは使用不可能。 |
|
|
バーティカルバー | |
"
|
引用符 | スペースを含むファイル名の始まりと終わりを指定するのに使われるため、Windowsで使用不可能。 |
<
|
小なり記号 | |
>
|
大なり記号 | |
&
|
アンパサンド | |
.
|
終止符 | 8.3形式では2つ以上の終止符を使用できず、ファイル名の最初や最後に終止符を使うこともできない。 |
|
半角スペース(末尾) | 8.3形式を取り扱うデータ構造上の都合[注釈 1]から、MS-DOSで使用不可能。 |
a -z
|
英小文字 | CD-ROM向けファイルシステムのうち、ISO 9660 Level 1では使用不可能。MS-DOSでは読み書き不能につき使用不可能。 |
日本語環境ではJIS X 0201の歴史的な経緯から、ASCIIのバックスラッシュに相当する0x5Cは半角円記号(円マーク)で表示されることが多いものの、フォントにも依存する。Windowsにおいて、ASCIIバックスラッシュと同じ文字コードを持つ半角の円記号はファイル名の一部として使用できないが、全角の円記号¥
はファイル名の一部として使用できる。さらにUnicodeには別の円記号¥
としてU+00A5が定義されており、これはWindows NT系OSおよびNTFSであればファイル名の一部として使用することはできる。ただし、Windows 9x系が使われていた時代やそれ以前[13]に開発されたFAT12/FAT16/FAT32などの古いファイルシステムでは、ファイル名のエンコードにOEMコードページ(ANSIマルチバイト文字セット)が使われている。システムロケールを日本語(Microsoftコードページ932)に設定したWindows環境の場合はWideCharToMultiByte()
関数などを使ってUnicode文字列をOEMマルチバイト文字列に変換する際、U+00A5が0x5Cにマッピングされてしまう。この動作はディレクトリトラバーサルを引き起こす可能性があるセキュリティホールであるため、アプリケーションはFATファイル名として変換される可能性のある文字列にU+00A5が入り込まないように配慮すべきである[14]。
使用が不可能なファイル名
[編集]一般的なファイルシステムでは、単独の.
はカレントディレクトリを、..
は上位ディレクトリを表す特殊なファイル名であるため、任意のファイル名として使うことはできない。
WindowsとMS-DOSでは、以下の名前もOSによって予約[注釈 2]されており、使用不可能である。
CON, PRN, AUX, CLOCK$, NUL COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, COM¹, COM², COM³ LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, LPT¹, LPT², LPT³
WindowsはISO/IEC 8859-1(Windows-1252)の上付き数字(¹, ², ³)を通常の数字(1, 2, 3)として認識し、COM#
とLPT#
の有効な一部として扱うため、これらを含むパターンも予約されている[15]。
ここで挙げたものは不完全な一覧であり、ファイルシステムごとの正確な名前付けの規則については外部リンク先を参照されたい。
ファイル名の重複
[編集]前述したとおり、メモリ上のデータをファイルとして保存する際は、暗黙的または明示的にファイル名を設定する必要がある。ただし一般的には、1つのコンピュータに、同一のフルパスを持つファイルが複数存在することは不可能となっている。そのため、保存先として利用しようとしているストレージの中に、同一のフルパスを持つファイルがすでに存在する(同一の親ディレクトリ内にまったく同じ名前のファイルがすでに存在する)場合は、置き換える(上書き保存する)か、別名で保存するか、キャンセルするかを選択しなければならない。ファイル名の大文字と小文字を区別しない環境では、大文字と小文字の違いだけでは別名にならず、同じ名前として扱われることにも留意する必要がある。
しかし、業務用のメインフレーム(汎用機)等では、パス構造を採用しておらず、同じファイル名の存在を許容する場合があるが、一般には使用されていないため説明を省略する。
なお、一般的なオンラインストレージサービスでは、エンドユーザー向けに表示されているファイル名は便宜上の表示名 (display name) にすぎず、内部的なファイル名とは別物である。表示名を変更しても内部名は変わらず、変更履歴も継承される。そのため、Google ドライブのように同一の親フォルダー内に同じ名前を持つファイルが複数存在することが可能となっているサービスもある。ただし、まったく同じ名前を付けてしまうと紛らわしいため、管理しやすさの観点から異なる名前を付けるのが通例である。
脚注
[編集]注釈
[編集]- ^ FAT形式のファイルシステムでは、ディレクトリエントリ(ファイル名・属性・実データ開始位置の一覧)におけるファイル名データの終端記号がなく、ベース名8バイトと拡張子3バイトについて、印字可能文字以外の個所は半角スペース (0x20) で埋められる。ファイル名の最後にスペースを打ち込んだ場合、ファイル名終端以降なのか有効な半角スペースなのか区別ができなくなってしまう。Windowsでは取り扱っているファイルが記録されている実際のファイルシステム仕様にかかわらずこの仕様が前提となっており、たとえば(ファイル名終端の半角スペースを識別できる)NTFS形式のパーティションに作成されているファイルに対しても、ファイル名末尾に半角スペースがあるとうまく操作ができない。[要出典]
- ^ 「デバイスファイル」「予約デバイス名」または「予約ファイル名」と呼ばれており、プリンターやキーボードなどのデバイスをファイルに見立ててデータを入出力するための仕組みがある(DOSコマンドでの例:
copy sample.txt prn
)。
出典
[編集]- ^ a b path::filename - cpprefjp C++日本語リファレンス
- ^ a b §File and Directory Names : Naming Files, Paths, and Namespaces - Win32 apps | Microsoft Learn
- ^ File input/output - cppreference.com
- ^ CreateFileW function (fileapi.h) - Win32 apps | Microsoft Learn
- ^ MoveFileW function (winbase.h) - Win32 apps | Microsoft Learn
- ^ §Paths : Naming Files, Paths, and Namespaces - Win32 apps | Microsoft Learn
- ^ §Short vs. Long Names : Naming Files, Paths, and Namespaces - Win32 apps | Microsoft Learn
- ^ Apple、iOS 11を20日に提供開始 - 「Dock」「ファイル」など追加 | マイナビニュース
- ^ path::stem - cpprefjp C++日本語リファレンス
- ^ basename — return non-directory portion of a pathname | The Open Group Base Specifications Issue 8 / IEEE Std 1003.1-2024 | The IEEE and The Open Group
- ^ basename — return the last component of a pathname | The Open Group Base Specifications Issue 8 / IEEE Std 1003.1-2024 | The IEEE and The Open Group
- ^ ASCII.jp:Windowsでファイルやフォルダーに「使わない方がいい」文字 (1/2)
- ^ Overview of FAT, HPFS, and NTFS File Systems - Windows Client | Microsoft Learn
- ^ Character Sets Used in File Names - Win32 apps | Microsoft Learn
- ^ §Naming Conventions : Naming Files, Paths, and Namespaces - Win32 apps | Microsoft Learn
関連項目
[編集]外部リンク
[編集]- Microsoft