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文档: 通用文件访问函数