命名及查找文件

目录操作

对文件命名的细节随计算机系统的不同而改变,但 Wolfram 系统提供了所有系统可用的一般机制.

Wolfram 系统假定文件放置在各种级别的目录 中,要找出一个文件时,Wolfram 系统不仅要知道文件名,还要知道该文件所在的目录序列.

在任何时刻,有一个当前工作目录 ,要确定一个文件或目录时,就要给出它们相对于该目录的位置. 当要指定该目录中的一个文件时,就不需要给出目录信息,只需给出文件名即可.

Directory[]当前工作目录
SetDirectory["dir"]设置当前工作目录
ResetDirectory[]转到前一个工作目录

目录操作.

这里给出当前工作目录字符串.
In[1]:=
Click for copyable input
设置当前工作目录是 子目录.
现在的工作目录与以前的不同.
转到以前的工作目录.

调用 SetDirectory 时可以给出所用操作系统能识别的任何目录名. 因此,例如,在 Unix 系统中,可以用 指定上一级目录,用 指定主目录.

SetDirectory 进入一个目录时,Wolfram 语言总要提示前一个目录. 可以用 ResetDirectory 返回到前一目录. 一般来说,Wolfram 语言维持一个由 DirectoryStack[] 给出的目录堆栈. 每次调用 SetDirectory时,就向堆栈中加一个新目录,而每一次调用 ResetDirectory 时就从堆栈中删除一个目录.

ParentDirectory[]当前工作目录的父目录
$InitialDirectoryWolfram 系统系统启动的初始目录
$HomeDirectory定义过的主目录
$BaseDirectory由 Wolfram 系统加载的系统文件的基层目录
$UserBaseDirectory由 Wolfram 系统加载的用户特定文件的基层目录
$InstallationDirectoryWolfram 系统安装所在的顶层目录

特殊目录.

搜索文件

当给出一个文件后,Wolfram 系统一般要经过几步来找到所需的文件. 第一步是使用所用操作系统或命令解释程序中的标准机理.

Wolfram 系统检查所给文件的全名,看是否有 等通配符. 发现了这些字符时,就将全名送到操作系统或命令解释程序去解释. 这意味着在使用 Unix 系统时,name* 等构造就在此处展开. 但一般地,Wolfram 系统获取操作系统或命令解释程序的结果,并将其作为文件全名.

对输出文件而言,这是 Wolfram 系统进行的最后一个处理. 当 Wolfram 系统没有找到所指定的文件时,它就产生这个文件.

当从一个文件输入时,Wolfram 系统要进行另一轮的输入. Wolfram 系统查看应该搜索的 Path 选项值. Path 选项的默认设置是全局变量 $Path.

Get["file",Path->{"dir1","dir2",}]得到一个文件,相对于目录 进行搜索
$Path相对于输入文件搜索的默认路径列表

文件的搜索路径.

一般地,全局变量 $Path 的定义是字符串列表,其中每个字符串代表一个子目录. 每输入一个文件后,Wolfram 系统就逐个将这些目录临时作为当前工作目录,从其中寻找所给的文件.

这是 $Path 的一个典型设置. 先列出的是当前目录()和主目录().

也可以使用 FindFile 来定位一个文件.

FindFile["name"]搜索具有特定名并能被 Get 和相关函数加载的文件
FileExistsQ["name"]判断文件是否存在

$Path 上搜索一个文件.

FindFile$Path 中搜索所有目录,并且返回由 GetNeeds 和其它函数加载的文件的绝对名. FileExistsQ 检验具有给定名的文件是否存在.

In[5]:=
Click for copyable input
Out[5]=

应用于程序包名称的 FindFile 从该程序包返回 init.m 文件的绝对名称.

In[5]:=
Click for copyable input
Out[5]=

列出目录内容

FileNames[]列出当前工作目录中的所有文件
FileNames["form"]列出当前工作目录中文件名与字符串模式 form 匹配的所有文件
FileNames[{"form1","form2",}]列出文件名与任一个 匹配的所有文件
FileNames[forms,{"dir1","dir2",}]给出在任意一个 目录中文件名与 forms 匹配的所有文件的全名
FileNames[forms,dirs,n]包括向下 n 层子目录中的文件
FileNames[forms,dirs,Infinity]包括所有子目录中的文件
FileNames[forms,$Path,Infinity]给出在 $Path 目录的任一子目录中名与 forms 匹配的所有文件

在特定目录中得到一个文件列表.

FileNames 的返回值是对应于文件名的字符串. 当返回到一个在当前目录中的文件时,它给出相对于当前目录的文件名. 请注意,所有文件名的格式适合于产生它们的计算机系统.

这里是当前工作目录中所有结尾为 的文件列表.
这里列出了在以 开头的子目录中和当前工作目录中以 开头的文件.

提供给 FileNames 的文件名可以使用 Wolfram 系统的任何字符串模式对象,通常与操作符 ~~ 合起来使用.

这里给出当前工作目录中名称匹配 形式的所有文件.
这里仅列出名称具有 形式的文件,其中 d 是一个或多个数字的序列.

组成文件名

DirectoryName["file"]从文件名中提取目录名
FileNameJoin[{"directory","name"}]由一个目录名和一个文件名组成完整的文件名
ParentDirectory["directory"]给出一个目录的父目录
ToFileName[{"dir1","dir2",},"name"]由不同层次的目录名组成完整的文件名
ToFileName[{"dir1","dir2",}]由不同层次的目录名组成一个单独的目录名

操作文件名.

应该看到不同计算机系统以不同的方式给出文件名. 因此,例如,微软视窗系统的形式一般是 ,而 Unix 的形式是 . 函数 FileNameJoin 根据所用的计算机系统以适当的方式组成文件名.

这里给出了文件的目录部分.
In[8]:=
Click for copyable input
Out[8]=
这里构造了 所在目录中另一个文件的全名.
In[9]:=
Click for copyable input
Out[9]=
FileNameSplit["name"]把文件名分为目录名和文件名的一个列表
FileNameTake["name",]提取部分文件名
FileNameDrop["name",]丢掉部分文件名
FileNameDepth["name"]在文件名中获取路径元素的数目
$PathnameSeparator用于当前操作系统的路径名分隔器

操作文件名.

类似 FileNameSplitFileNameJoin 的函数对文件名提供了额外的操作. 它们使用与当前操作系统相匹配的文件名分隔器,并对文件名的分隔做适当的操作. 默认情况下,FileNameJoin 将使用 $PathnameSeparator 来对当前操作系统产生合适的具有规范形式的名称.

当要建立一个相关文件的集合时,当读一个文件时能涉及另一个文件往往是方便的. 全局变量 $InputFileName 给出当前输入的文件名. 用 DirectoryNameToFileName 就可以方便地指定其它相关的文件名.

$InputFileName正在进行输入的文件名或流名

找出涉及 Wolfram 语言当前正在读的文件的方法.

在 Wolfram 语言中处理文件的一个问题是文件和目录名的形式随计算机系统的不同而不同. 这意味着,比如,包含标准Wolfram 语言程序包的文件的名称可能在不同系统上很不相同. 通过一系列转换,我们可以在所有系统上用同样的命令读入标准 Wolfram 语言程序包. 这里的工作方式是由每个程序包定义一个形式为 的所谓的 Wolfram 语言上下文. 在每个系统中,所有文件都根据它们所定义的上下文命名. 那么当用户使用命令 时,Wolfram 语言自动把上下文的名称翻译成适合用户特定计算机系统的文件名.

标准文件扩展名

file.mWolfram 系统的普通文本格式的表达式文件
file.nbWolfram 系统笔记本文件
file.mxWolfram 系统的 DumpSave 格式的定义

Wolfram 系统的经典文件名.

如果使用 Wolfram 系统的笔记本界面,那么 Wolfram 系统前端可以保存完整的笔记本,不仅包含了 Wolfram 语言输入和输出,而且包含文本、图形和其他资料.

传统上,Wolfram 系统笔记本文件名都以 .nb 结尾,而绝大多数 Wolfram 系统版本强制执行这样的传统.

FileBaseName["name"]不含扩展名的文件名
FileExtension["name"]文件名的扩展名

文件名和扩展名.

可以使用 FileBaseNameFileExtension 提取文件名和扩展名.

当在 Wolfram 系统前端打开一个笔记本,Wolfram 系统将自动显示笔记本的内容,但是除非明确要求,否则它不会把任何内容发送到内核进行计算.

但是,在一个 Wolfram 系统笔记本中,可以使用前端的 单元 菜单来识别某些单元为初始单元 ,并且如果这么做的话,这些单元的内容将在打开笔记本的时候自动计算.

单元括号内的 I 表明第二个单元当笔记本被打开的时候,将作为初始单元被计算.

28.gif

有时候,以包含解释文本的笔记本和包含原始 Wolfram 系统定义的程序包的形式保持 Wolfram 语言资料是方便的. 要做到这一点,可以把 Wolfram 语言定义放入笔记本的初始单元中. 每处保存笔记本,前端将保存一个相关的仅包含原始 Wolfram 语言定义的 .m 文件.