pg_ls_dir()
是一个系统函数,用于检查本地文件系统上目录的内容。
pg_ls_dir()
添加于 PostgreSQL 8.1。
用法
pg_ls_dir (dirname
text
[,missing_ok
boolean
,include_dot_dirs
boolean
] )
→ 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文档: 通用文件访问函数