pg_ls_dir() 是一个用于检查本地文件系统中目录内容的系统函数。
pg_ls_dir() 添加于 PostgreSQL 8.1。
用法
pg_ls_dir (dirnametext[,missing_okboolean,include_dot_dirsboolean] )
→ setoftext
pg_ls_dir() 可用于返回本地文件系统中 postgres 系统用户有权访问的任何目录的内容。
它返回的文件系统对象是未排序的,因此通常与 ORDER BY 结合使用。
自 PostgreSQL 9.5 起,pg_ls_dir() 可选地返回特殊目录 "." 和 "..",并且可选地在指定目录未找到时不返回错误。
权限
默认情况下,pg_ls_dir() 仅限于超级用户,但可以授予其他用户 EXECUTE 权限来运行此函数。
请注意,与其他 pg_ls_...() 函数不同,pg_ls_dir() 可用于访问文件系统中的任何目录,而不仅仅是 PostgreSQL 使用的目录,因此默认情况下不提供给 pg_monitor 默认角色 的成员使用。
源代码
pg_ls_dir() 实现于 src/backend/utils/adt/genfile.c。
变更历史
- PostgreSQL 9.5
- 添加了选项
missing_ok和include_dot_dirs(提交 cb2acb10)
- 添加了选项
- PostgreSQL 8.1
- 添加(提交 b609695b)
示例
pg_ls_dir() 的基本执行
postgres=# SELECT pg_ls_dir('/') ORDER BY 1 LIMIT 5;
pg_ls_dir
--------------
bin
boot
dev
etc
home
(5 rows)
包含特殊“点”目录
postgres=# SELECT pg_ls_dir(current_setting('data_directory') || '/pg_stat_tmp', FALSE, TRUE) ORDER BY 1;
pg_ls_dir
-----------------------
.
..
db_0.stat
db_13832.stat
db_16385.stat
global.stat
pgss_query_texts.stat
(7 rows)
尝试读取可能不存在的目录
postgres=# SELECT pg_ls_dir('/foo');
ERROR: could not open directory "/foo": No such file or directory
安全地尝试读取可能不存在的目录
postgres=# SELECT pg_ls_dir('/foo', TRUE, FALSE);
pg_ls_dir
-----------
(0 rows)
请注意,尝试读取 postgres 系统用户无法访问的目录始终会导致错误。
postgres=# SELECT pg_ls_dir('/root');
ERROR: could not open directory "/root": Permission denied
postgres=# SELECT pg_ls_dir('/root', TRUE, FALSE);
ERROR: could not open directory "/root": Permission denied
参考资料
- PostgreSQL 文档: 通用文件访问函数
