36.2 文件系统工具

Octave 包含许多实用函数,用于复制、移动、重命名和删除文件;创建、读取和删除目录;检索文件的状态信息;以及处理文件和路径名称。

 
movefile f1
movefile f1 f2
movefile f1 f2 f
movefile (f1)
movefile (f1, f2)
movefile (f1, f2, 'f')
[status] = movefile (…)
[status, msg] = movefile (…)
[status, msg, msgid] = movefile (…)

将源文件或目录 f1 移动到目标位置 f2

名称 f1 可以包含通配符模式,或是一个字符串元胞数组。如果 f1 展开为多个文件名,则 f2 必须是一个目录。

如果未指定目标 f2,则目标为当前工作目录。如果 f2 是一个文件名,则 f1 将被重命名为 f2

当指定了强制标志 'f' 时,任何已存在的文件将被覆盖而不会提示。

如果成功,status 为逻辑值 1,且 msgmsgid 为空字符串 ("")。否则,status 为逻辑值 0,msg 包含一个系统相关的错误消息,msgid 包含一个唯一的消息标识符。请注意,状态码正好与 system 命令相反。

另请参阅: rename, copyfile, unlink, delete, glob.

 
rename old new
[status, msg] = rename (old, new)

将文件 old 的名称更改为 new

如果成功,status 为 0,msg 为空字符串。否则,status 为 -1,msg 包含一个系统相关的错误消息。

另请参阅: movefile, copyfile, lstat, unlink, delete.

 
copyfile f1 f2
copyfile f1 f2 f
copyfile (f1, f2)
copyfile (f1, f2, 'f')
[status, msg, msgid] = copyfile (…)

将源文件或目录 f1 复制到目标 f2

名称 f1 可以包含通配符模式,或是一个字符串元胞数组。如果 f1 展开为多个文件名,则 f2 必须是一个目录。

当指定了强制标志 'f' 时,任何已存在的文件将被覆盖而不会提示。

如果成功,status 为逻辑值 1,且 msgmsgid 为空字符串 ("")。否则,status 为逻辑值 0,msg 包含一个系统相关的错误消息,msgid 包含一个唯一的消息标识符。请注意,状态码正好与 system 命令相反。

另请参阅: movefile, rename, unlink, delete, glob.

 

删除名为 file 的文件。

如果成功,status 为 0,msg 为空字符串。否则,status 为 -1,msg 包含一个系统相关的错误消息。

另请参阅: delete, rmdir.

 

创建一个指向现有文件的新链接(也称为硬链接)。

如果成功,status 为 0,msg 为空字符串。否则,status 为 -1,msg 包含一个系统相关的错误消息。

另请参阅: symlink, unlink, readlink, lstat.

 

创建一个符号链接 new,其中包含字符串 old

如果成功,status 为 0,msg 为空字符串。否则,status 为 -1,msg 包含一个系统相关的错误消息。

另请参阅: link, unlink, readlink, lstat.

 

读取符号链接 symlink 的值。

如果成功,result 包含符号链接 symlink 的内容,err 为 0,msg 为空字符串。否则,err 为非零值,msg 包含一个系统相关的错误消息。

另请参阅: lstat, symlink, link, unlink, delete.

 
mkdir dirname
mkdir parent dirname
mkdir (dirname)
mkdir (parent, dirname)
[status, msg, msgid] = mkdir (…)

在目录 parent 中创建名为 dirname 的目录,必要时会创建所有中间目录。

如果 dirname 是相对路径,且未指定 parent 目录,则使用当前工作目录。

如果成功,status 为逻辑值 1,且 msgmsgid 为空字符串 ("")。否则,status 为逻辑值 0,msg 包含一个系统相关的错误消息,msgid 包含一个唯一的消息标识符。请注意,状态码正好与 system 命令相反。

创建目录时,权限将设置为 0777 - UMASK

另请参阅: rmdir, pwd, cd, umask.

 
rmdir dir
rmdir (dir, "s")
[status, msg, msgid] = rmdir (…)

删除名为 dir 的目录。

如果提供了可选的第二个参数且值为 "s",则同时递归删除所有子目录。

如果成功,status 为逻辑值 1,且 msgmsgid 为空字符串 ("")。否则,status 为逻辑值 0,msg 包含一个系统相关的错误消息,msgid 包含一个唯一的消息标识符。

另请参阅: mkdir, confirm_recursive_rmdir, pwd.

 
val = confirm_recursive_rmdir ()
old_val = confirm_recursive_rmdir (new_val)
old_val = confirm_recursive_rmdir (new_val, "local")

查询或设置控制 Octave 在递归删除目录树之前是否询问确认的内部变量。

当在函数内部使用 "local" 选项调用时,该变量在函数及其调用的任何子例程中本地更改。退出函数时恢复原始变量值。

另请参阅: rmdir.

 
mkfifo (name, mode)
[status, msg] = mkfifo (name, mode)

创建一个名为 name、文件模式为 mode 的 FIFO 特殊文件。

mode 被解释为一个八进制数,并受 umask 处理的影响。最终计算出的模式为 mode - umask

如果成功,status 为 0,msg 为空字符串。否则,status 为 -1,msg 包含一个系统相关的错误消息。

另请参阅: pipe, umask.

 
oldmask = umask (mask)

设置文件创建的权限掩码。

参数 mask 是一个整数,被解释为一个八进制数。

如果成功,返回掩码的先前值(作为要解释为八进制数的整数);否则会打印错误消息。

权限掩码是一个 UNIX 概念,用于在文件系统上创建新对象(如文件、目录或命名 FIFO)时使用。要创建的对象具有八进制数 mode 的基本权限,这些权限会根据 mask 的八进制值进行修改。新对象的最终权限为 mode - mask

另请参阅: fopen, mkdir, mkfifo.

 
[info, err, msg] = stat (file)
[info, err, msg] = stat (fid)
[info, err, msg] = lstat (file)
[info, err, msg] = lstat (fid)

返回一个结构体 info,其中包含关于 file 或文件标识符 fid 的以下信息。

dev

包含此文件目录项的设备 ID。

ino

文件的 inode 编号。

mode

文件模式,以整数形式表示。使用函数 S_ISREGS_ISDIRS_ISCHRS_ISBLKS_ISFIFOS_ISLNKS_ISSOCK 来从该值提取信息。

modestr

文件模式,以十个字母或短划线的字符串形式表示,如同 ls -l 返回的那样。

nlink

链接数。

uid

文件所有者的用户 ID。

gid

文件所属组的组 ID。

rdev

块设备或字符特殊文件的设备 ID。

size

字节大小。

atime

最后访问时间,格式与 time 返回的时间值相同。请参阅 计时工具

mtime

最后修改时间,格式与 time 返回的时间值相同。请参阅 计时工具

ctime

最后文件状态更改时间,格式与 time 返回的时间值相同。请参阅 计时工具

blksize

文件中块的大小。

blocks

分配给文件的块数。

如果调用成功,err 为 0,msg 为空字符串。如果文件不存在或发生其他错误,info 为空矩阵,err 为 −1,msg 包含相应的系统错误消息。

如果 file 是符号链接,stat 将返回链接引用的实际文件的信息。如果您需要关于符号链接本身的信息,请使用 lstat

例如:

[info, err, msg] = stat ("/vmlinuz")
  ⇒  info =
     {
       atime = 855399756
       rdev = 0
       ctime = 847219094
       uid = 0
       size = 389218
       blksize = 4096
       mtime = 847219094
       gid = 6
       nlink = 1
       blocks = 768
       mode = -rw-r--r--
       modestr = -rw-r--r--
       ino = 9316
       dev = 2049
     }
  ⇒  err = 0
  ⇒  msg =

另请参阅: lstat, ls, dir, isfile, isfolder.

 
tf = S_ISBLK (mode)

如果 mode 对应于块设备,则返回 true。

假设 mode 的值来自对 stat 的调用。

另请参阅: stat, lstat.

 
tf = S_ISCHR (mode)

如果 mode 对应于字符设备,则返回 true。

假设 mode 的值来自对 stat 的调用。

另请参阅: stat, lstat.

 
tf = S_ISDIR (mode)

如果 mode 对应于目录,则返回 true。

假设 mode 的值来自对 stat 的调用。

另请参阅: stat, lstat.

 
tf = S_ISFIFO (mode)

如果 mode 对应于 FIFO,则返回 true。

假设 mode 的值来自对 stat 的调用。

另请参阅: stat, lstat.

 
tf = S_ISLNK (mode)

如果 mode 对应于符号链接,则返回 true。

假设 mode 的值来自对 stat 的调用。

另请参阅: stat, lstat.

 
tf = S_ISREG (mode)

如果 mode 对应于常规文件,则返回 true。

假设 mode 的值来自对 stat 的调用。

另请参阅: stat, lstat.

 
tf = S_ISSOCK (mode)

如果 mode 对应于套接字,则返回 true。

假设 mode 的值来自对 stat 的调用。

另请参阅: stat, lstat.

 
fileattrib
fileattrib file
fileattrib (file)
[status, attrib] = fileattrib (…)
[status, msg, msgid] = fileattrib (…)

报告关于 file 的属性信息。

如果未指定文件或目录,则报告当前工作目录的信息。

如果成功,输出是一个包含以下字段的结构体:

Name

file 的完整名称。

archive

如果 file 是存档文件,则为 true(Windows)。

system

如果 file 是系统文件,则为 true(Windows)。

hidden

如果 file 是隐藏文件,则为 true(Windows)。

directory

如果 file 是目录,则为 true。

UserRead
GroupRead
OtherRead

如果用户(组;其他用户)对 file 具有读取权限,则为 true。

UserWrite
GroupWrite
OtherWrite

如果用户(组;其他用户)对 file 具有写入权限,则为 true。

UserExecute
GroupExecute
OtherExecute

如果用户(组;其他用户)对 file 具有执行权限,则为 true。

如果某个属性不适用(例如,Unix 系统上的 archive),则该字段设置为 NaN。

如果 file 包含通配符,则所有匹配文件的信息以结构体数组形式返回。

如果请求输出,第一个是 status,操作成功时值为 1,否则为 0。第二个输出在操作成功时包含上述结构体(attrib);否则,第二个输出是系统相关的错误消息(msg)。第三个输出在操作成功时为空字符串(""),在失败时为唯一的消息标识符(msgid)。

另请参阅: stat, glob.

 
tf = isfile (f)

如果 f 是常规文件,则返回 true,否则返回 false。

如果 f 是字符串元胞数组,则 tf 是相同大小的逻辑数组。

另请参阅: isfolder, exist, stat, is_absolute_filename, is_rooted_relative_filename.

 
tf = isdir (f)

不推荐使用此函数。请改用 isfolderfile_in_loadpath

如果 f 是目录,则返回 true,否则返回 false。

兼容性说明:同名 MATLAB 函数也会在加载路径目录中搜索 f。要模拟此行为,请使用

tf = ! isempty (file_in_loadpath (f))

另请参阅: isfolder, file_in_loadpath, exist, stat, is_absolute_filename, is_rooted_relative_filename.

 
tf = isfolder (f)

如果 f 是目录,则返回 true,否则返回 false。

如果 f 是字符串元胞数组,则 tf 是相同大小的逻辑数组。

另请参阅: isfile, exist, stat, is_absolute_filename, is_rooted_relative_filename.

 
files = readdir (dir)
[files, err, msg] = readdir (dir)

将目录 dir 中的文件名作为字符串元胞数组返回。

如果发生错误,files 返回一个空的元胞数组。如果成功,err 为 0,msg 为空字符串。否则,err 为非零值,msg 包含一个系统相关的错误消息。

另请参阅: ls, dir, glob, what.

 
cstr = glob (pattern)

给定一个模式字符串数组(字符数组或元胞数组)pattern,返回匹配其中任何一个模式的文件名的元胞数组,如果没有匹配的模式,则返回空元胞数组。

模式字符串被解释为文件名通配模式(如同 Unix shell 中使用的那样)。

在模式中:

*

匹配任何字符串,包括空字符串,

?

匹配任何单个字符,

[…]

匹配任何包含在括号内的字符。

在查找匹配的文件名之前,会对每个模式进行波浪号扩展。例如:

ls
   ⇒ 
      file1  file2  file3  myfile1 myfile1b
glob ("*file1")
   ⇒ 
      {
        [1,1] = file1
        [2,1] = myfile1
      }
glob ("myfile?")
   ⇒ 
      {
        [1,1] = myfile1
      }
glob ("file[12]")
   ⇒ 
      {
        [1,1] = file1
        [2,1] = file2
      }

注意:在 Windows 上,包含非 ASCII 字符的模式不受支持。

另请参阅: ls, dir, readdir, what.

 
fname = file_in_path (path, file)
fname = file_in_path (path, file, "all")

如果在 path 中能找到 file,则返回其绝对名称。

path 的值应该是一个冒号分隔的目录列表,格式如 path 所述。如果未找到文件,返回空字符串。例如:

file_in_path (EXEC_PATH, "sh")
     ⇒  "/bin/sh"

如果第二个参数是字符串元胞数组,则在路径的每个目录中搜索元胞数组的每个元素,并返回第一个匹配项。

如果提供了第三个可选参数 "all",则返回一个包含路径中所有同名文件的元胞数组。如果未找到任何文件,则返回空元胞数组。

另请参阅: file_in_loadpath, dir_in_loadpath, path.

 
sep = filesep ()
filesep ("all")

返回用于分隔目录名称的系统相关字符。

如果指定了 "all",函数以字符串形式返回所有有效的文件分隔符。文件分隔符列表是系统相关的。在 UNIX 或 Mac OS X 下为 ‘/’(正斜杠),在 Windows 下为 ‘/’ 和 ‘\’(正斜杠和反斜杠)。

另请参阅: pathsep.

 
[dir, name, ext] = fileparts (filename)

返回 filename 的目录、名称和扩展名部分。

输入 filename 是一个将被解析的字符串。不会检查指定的文件名或目录是否实际存在。

另请参阅: fullfile, filesep.

 
filename = fullfile (dir1, dir2, …, file)

从各个部分构建完整文件名。

该函数智能地连接任意数量的路径组件。返回值是每个组件的连接,路径的每个部分之间恰好有一个文件分隔符,并且最多有一个前导和/或尾随文件分隔符。

输入参数可以是字符串或字符串元胞数组。任何是字符串元胞数组的输入参数必须包含单个字符串,或者大小相等。在这种情况下,函数返回与输入元胞数组相同维度的文件路径字符串元胞数组,例如:

fullfile ("/home/username", "data", {"f1.csv", "f2.csv", "f3.csv"})
  ⇒ 
      {
        [1,1] = /home/username/data/f1.csv
        [1,2] = /home/username/data/f2.csv
        [1,3] = /home/username/data/f3.csv
      }

在 Windows 系统上,虽然正斜杠文件分隔符有效,但会被替换为反斜杠。此外,驱动器号前的文件分隔符会被去除以获得有效的文件路径。

注意:fullfile 不会对生成的完整文件名进行任何验证。

另请参阅: fileparts, filesep.

 
newstr = tilde_expand (string)
newcstr = tilde_expand (cellstr)

string 执行波浪号扩展。

如果 string 以波浪号字符(‘~’)开头,则第一个斜杠之前的所有字符(如果没有斜杠则是所有字符)被视为可能的用户名,并且波浪号及其后直到斜杠的字符将被替换为指定用户的主目录。如果波浪号后面紧跟斜杠,则波浪号被替换为运行 Octave 的用户的主目录。

如果输入是字符串元胞数组 cellstr,则对每个字符串元素执行波浪号扩展。

示例:

tilde_expand ("~joeuser/bin")
     ⇒  "/home/joeuser/bin"
tilde_expand ("~/bin")
     ⇒  "/home/jwe/bin"
 
[cname, status, msg] = canonicalize_file_name (fname)

返回文件 fname 的规范名称。

如果文件不存在,返回空字符串(\"\")。不会对 fname 执行波浪号扩展。

另请参阅: make_absolute_filename, is_absolute_filename, is_rooted_relative_filename, is_same_file, tilde_expand.

 
abs_fname = make_absolute_filename (file)

返回从文件系统根目录开始的 file 的完整名称。

不会检查 file 是否存在。不会对 file 执行波浪号扩展。

另请参阅: canonicalize_file_name, is_absolute_filename, is_rooted_relative_filename, isfolder, tilde_expand.

 
tf = is_absolute_filename (file)

如果 file 是绝对文件名,则返回 true。

另请参阅: make_absolute_filename, is_rooted_relative_filename, is_same_file.

 
tf = is_same_file (filepath1, filepath2)

如果 filepath1filepath2 指向同一个文件或目录,则返回 true。

如果 filepath1filepath2 是字符串元胞数组,则返回相同大小的数组,其中包含针对元胞数组每个成员的上述描述的值。另一个参数也可以是字符串元胞数组(相同大小)或字符串。

编程说明:根据操作系统和文件系统的不同,同一个文件或文件夹可以通过不同的路径引用。特别是在 Windows 平台上,路径可能在大小写(file1 vs. FILE1)、文件分隔符(‘\’ vs. ‘/’)和格式(A~spaces.txt(8.3 约定)vs. A filename with spaces.txt)上有所不同。如果 filepath1filepath2 中的路径实际指向同一个文件或文件夹,则此函数返回 true,否则返回 false。

请注意,与 strcmp 不同,此函数要求 filepath1filepath2 都存在,并且指向同一个位置,才能返回 true。

另请参阅: canonicalize_file_name, strcmp.

 
tf = is_rooted_relative_filename (file)

如果 file 是根相对文件名,则返回 true。

另请参阅: make_absolute_filename, is_absolute_filename, is_same_file.

 
val = recycle ()
old_val = recycle (new_val)

查询或设置回收已删除文件的偏好。

当启用回收时,会永久删除文件的命令将改为将文件移动到临时位置(例如标记为"回收站"的目录)。

编程说明:此函数是为了 MATLAB 兼容性而提供的,但 Octave 中未实现回收功能。为帮助避免意外数据丢失,如果尝试启用文件回收,将引发错误。

另请参阅: delete, rmdir.