计算机文件(或称文件、电脑档案、档案)是存储在某种长期储存设备或临时存储设备中的一段数据流,并且归属于计算机文件系统管理之下。所谓“长期储存设备”一般指磁盘、光盘、磁带等。而“短期存储设备”一般指计算机存储器。需要注意的是,存储于长期存储设备的文件不一定是长期存储的,有些也可能是程序或系统运行中产生的临时数据,并于程序或系统退出后删除。
计算机“文件”一词最早在1952年用于计算机数据方面,指的是在打孔卡所储存的信息。
一种重要的文件是文本文件,是由一些字符的序列组成的。二进制文件一般是指除了文本文件以外的文件。
现代大多数计算机的操作系统中,文件是将数据安排成一维字节的容器,格式主要由其内容定义;而某些平台对文件格式或由扩展名称(扩展名)来指示,有关数据字节必须如何安排及有意义地解释的规则。例如纯文本文件(微软视窗的扩展名为.txt)的字节与ASCII或UTF-8字符相关系,而图像、影片和声音的格式则以其它扩展名解释。大多数文件类型也为元数据分配了一些字节,这允许文件携带一些关于本身的基本信息。
一些文件系统能存储支持格式以外的特殊数据,然后以扩展属性或分支把它当成文件。其它文件系统可借由跨斗(sidecar)档或依软件特定的数据库完成,然而,这些方法比容器和压缩包更易于丢失描述文件的元数据。
一个文件数据内容所有的字节数,即为该文件相关存储量的大小。大多数现代计算机的操作系统中,文件大小是系统限制下任何非负整数的字节。许多较旧的操作系统只纪录实体存储设备上,文件占用区块或磁道的数量。在这样的系统中,软件采用其它方法来纪录精确的字节数(例如CP/M使用特殊控制符Ctrl-Z来表示文字档的结尾)。
除非文件的内容恰好对应于固有存储池中的数据,文件大小的一般定义并不特别要求具有任何真正的意义;某个特殊情况是零字节文件,这或许是刚创建而尚未写入数据的,也可能作为文件系统中的某种标志,或是意外事故(磁盘中止操作的结果)。例如,典型的类Unix系统中,在bin目录的ls所指向的文件大小几乎很少变动。如果与dev目录中的null文件来比较,null也被当作是一个文件,但其大小是无意义的。(这可能造成误导,因为/dev/null并不是实在存有数据的内容:在类Unix系统中,所有资源包括设备都可如同文件一样被访问,但文件和设备之间仍然有不同区别-对系统内核来说它们的行为不同,而且/dev/null档的“大小”是一种晦涩的说明方式,把/dev/null当成是一个输出设备,它并没有所谓的文件大小。
计算机文件中的信息会包含较小的数据包(通常称为“记录”或“行”),它们各自不同但有一些常见的特征。例如,工资单中包含员工和其工资的详细信息;工资单文件中的每条记录只涉及一名员工,所有的记录则具有与工资相关的共同特征-这非常类似在没有计算机的办公室,将所有工资单的纸本文件放入特定文件柜中。文本文件其中包含了许多文字行,可对应于印在一张纸上的多行语句。或者,文件可以包含任意二进制大件(BLOB),或者它可以包含可执行文件。
将信息分组到文件中的方式完全取决于它的设计方式。这导致了多样化标准的文件结构,任何可想像到的,从最简单到最复杂的用途。大多数计算机文件根据软件的用途而产生、修改或删除文件以供给计算机程序使用。创建程序的开发人员决定需要哪些文件,如何使用它们与(通常以)它们的名称。
在一些使用案例中,计算机的用户能看到并利用软件处理文件内容。例如在文本编辑器软件中,用户操作他亲自命名的文字档。虽然数据内容由文本编辑器的内部程序格式来安排,但用户可以选择文件的名称和位置,并输入大部分信息(如字句和段落)而后存储于文件中。
许多应用程序将文件中的所有数据压缩成单一个文件,使用内部标记来分辨其中所包含类型的信息。压缩包的优点是减少文件数量、方便传输、减少存储空间,或只是整理过时的文件。在下一次使用之前,压缩包则必须需要被解压缩。
以应用程序可对文件运行,最基本的一些操作如下列:
计算机的文件可以被创建、移动、修改、增长、压缩和删除。大多数情况下,在计算机运行的应用程序会负责这些操作,但如果有需要,计算机的用户也可以操作文件。例如微软的Word文件通常是以微软的Word办公应用软件来创建和修改,以回应用户的操作指令;但用户也可以使用资源管理器(例如微软视窗系统上的)直接移动、重命名或删除这些文件)或以指令列(CLI)来作批处理。
在类Unix系统中,单一用户程序不能直接在文件系统的基础上运行。只有系统内核能处理文件,它透通地负责系统上所有用户程序处理文件的交互要求。计算机的操作系统提供了一个抽象的层级,这表示牵涉到用户空间的文件动作只能借由文件名称(而不是实际的文件把柄)。例如,rm filename并不是去删掉文件本身,而只能删除与实际文件系统之间的链接。文件可以有很多链接,但是当它们全部被删除时,系统内核则会认为文件设备的存储空间就能够重新分配利用。这个可用空间普遍被认为是数据安全上的风险(因有软件可将其中删除的文件撤销)。所以确保安全的删除程序都会使用系统内核的功能,去擦掉文件系统中的实际数据。
在现代计算机中通常使用文件的名称来访问。在某些操作系统中,该名称与文件本身相关系。在其它系统中,文件则可能是匿名的,由具有名称的链接指向。而后者的情况下,用户仍可识别与文件本身链接的名称,但这是虚拟的模拟,特别是当有多个链接指到同一文件的的情况。
目录是指文件(或链接)的位置。更一般地,目录是包含文件或指到文件的链接的列表;在这个定义中,“文件”一词包括了所位于的目录,这是极重要的概念,因为如此才有目录的层次结构存在,即包含子目录的目录。引用目录中的文件名通常必须是唯一的。换句话说,一个目录下的文件名称不能相同。而在某些操作系统中,名称可能包括了类型,这表示目录中可以包含相同名称但多种不同类型的对象(例如目录和文件)。
在计算机的文件系统中,文件名与位于目录的路径必须和其它文件有唯一的区隔,两个文件不可以具有相同的名称和路径。在匿名的文件系统中,则会在名字空间中有某一个文件的引用。大多数情况下,名字空间中的任何名称将完全指向零个或某一个文件,但是文件可在任何名字空间内由零个,一个或多个名称来表示。
根据应用程序的规则,由一定格式组成的的字符串才能当作文件或链接名称。名称是否正确取决于所使用的计算机系统类型。早期计算机只允许使用几个字母或数字作为文件名,但现代计算机允许包含几乎任何unicode字母或数字组合的长名称(有些最多到255个字符),让用户更容易从名称来理解文件的用途目的。某些计算机系统允许文件名包含空格;文件名大小写的区分由文件系统决定。Unix文件系统通常会区分文件名的大小写,并允许用户层级的应用程序,产生以相同字符串但大小写不同命名的文件。微软视窗系统支持多个文件系统,每个文件系统有关于大小写区分的策略;常见的FAT文件系统,如果用户用磁盘编辑器编辑目录条目中的文件名,可以有多个大小写不同的文件。然而,用户应用程序通常无法产生相同名称但大小写不同的多重文件。
大多数计算机使用文件夹或目录,不论是哪个用词,其概念都一样将文件安排为层次结构。每一个目录可包含任意数量的文件,它还可以包含其它目录,在其中的文件夹称为子目录。子目录也能包含更多的文件和目录等,而造成一个树状结构。其中的“主目录”(或“根目录”-名称因操作系统而异)包含任意数量的其它目录和文件。目录如同文件一样,可以给名(除了根目录之外,根目录通常没有名称)。运用目录使得以逻辑方式来组织文件变得更加容易。
当计算机允许使用目录时,每个文件和目录不仅具有自己的名称,而且还包含识别其所位于的路径。在路径中使用某种特殊字符(例如斜杠)来区分文件和目录名称。例如在右图示例中,/Payroll/Salaries/Managers 这个路径表示在名称为“Salaries”的目录中,有唯一名为“Managers”的文件。而“Salaries”又包含在名为“Payroll”的目录中。示例中的目录和文件名以斜杠分隔;最顶层或根目录没有名称,因此路径以斜杠开头(如果根目录具有名称,则会在此第一个斜杠之前)。
许多计算机系统使用文件名中的扩展名,来帮助识别它们包含的数据内容,也称为文件类型。在微软系统的扩展名由文件名末尾的句点组成,后跟几个字母来标识文件的类型。 .txt 的扩展名代表类型为文字档,一个 .doc 扩展名代表类型为微软办公室软件Word产生的文件,诸如此类。即使某个系统使用扩展名,系统识别和处理它们的程度可能会有所不同。在一些系统中它们是必需的,而其它系统完全忽略扩展名的存在。
许多现代计算机系统提供了保护文件避免意外和故意破坏的方法。系统可让多个用户设置个别文件的权限,以控制谁可以拥有修改、删除或产生文件和目录的权限。例如,授予用户只能读取文件或目录的权限,但不能修改或删除它;或者允许用户可读取和修改文件或目录,但不能运行它们。权限也能设置为仅允许某些特定用户查看文件或目录的内容。权限可防止未经授权的篡改或破坏文件中的信息,并将私人信息保密以防未经授权的用户。另一种保护机制是只读旗标。当文件被开启(由计算机程序或人类用户)时,可以查看文件但是不能修改,该旗标对于不可修改或删除的关键信息非常有用,例如仅供系统内部使用的特殊文件。一些系统还包括一个隐藏旗标,使某些文件不会出现;该旗标被系统用来隐藏那些用户不应该改变的基本系统文件。
任何有用途的文件都必须具有实体,亦即计算机系统中的文件(抽象概念),如果它完全存在则必须有真正的实物对应。在物理上,大多数计算机文件存在于某种类型的数据存储设备上。例如,大多数操作系统将文件存储在硬盘上。自20世纪60年代初以来,硬盘一直是长久性的存储形式。如果文件仅包含暂时的信息,它们可能被放入RAM中。在某些情况下,计算机文件也可以存储在其它介质上,如磁带、光盘,DVD、Zip或USB磁盘等。固态硬盘的使用也开始渐渐取代传统硬盘。在类Unix操作系统中,许多文件并没有与实际的物理存储设备相关系。例如在/dev/null, /dev, /proc和/sys目录下的大多数文件。这些是虚拟文件:它们被当作系统内核中的特殊对象,如运行的用户程序所见到的。文件通常以控制区块或把柄来表示。文件控制区块(FCB)是用于创建文件名等的存储区域,然后作为参数传递到操作系统,出现在较旧的IBM系统和早期的PC操作系统(包括CP/M和MS-DOS早期版本)。文件把柄通常是不透明的数据类型或整数,它是在1961年左右由在Burroughs B5000运行,基于ALGOL的Burroughs MCP引入的,但现在已经普及了。
虽然一个文件表现为一个单一的流,但它经常在磁盘不同的位置存储为多个数据碎片(甚至是多个磁盘)。操作系统会将它们组织成文件系统,每个文件放在特定的文件夹或目录中。
文件是由软件创建的,而且符合特定的文件格式。
当计算机文件含有非常重要的信息时,则有备份程序的需求以防止破坏文件的灾难。备份指的是在另外独立的存储设备上,创建文件的复制版本,以确保当计算机发生事故,或者当文件被意外删除时,可以从备份将它们还原。有很多种备份文件的方法。大多数计算机系统提供工具程序来协助备份过程,如果有许多文件需要安全备份,这些程序会非常耗费时间。文件通常被复制到可移动的介质上,例如写入CD或磁带。将文件复制到同一台计算机中的另一个硬盘或可防止一个磁盘出现故障,但如果有必要防止整台计算机出现故障或破坏,则必须在可移动的其他介质上复制文件,并将备份存放在另一个安全而且距离不同的位置。
祖-父-子备份方法会自动进行三次备份;祖文件是文件最旧的复制版本,而子文件是目前最新的复制版本。
计算机组织、命名、存储和操作文件的方式被统称为其文件系统。大多数计算机至少有一个文件系统。有些计算机可使用数种不同的文件系统。例如在较新的微软视窗系统上,除了最新版本默认的NTFS文件系统之外,还向前支持旧版MS-DOS的FAT文件系统。每种系统都有优缺点,例如FAT仅允许无空格,八字符的文件名(加上三个字符的扩展名),而NTFS则可包含空格的更长名称。用户可在NTFS中将文件命名为“Payroll records”(包含一个空格),但在FAT中文件名会受限制变成如“payroll.dat”这样的名称(除非使用允许更长名称的VFAT扩展)。文件管理器是允许用户创建、移动、删除和重命名文件和目录的公用程序,虽然实际上它只是对文件或目录名称的操作,而非读取文件内容或将信息存储到文件中。每个计算机系统为其本机文件系统提供至少一个文件管理器程序。例如文件管理器(以前称为视窗资源管理器)通常用于微软的视窗系统,而在Linux系统常见的文件管理器则是Nautilus。