如何在C++中检查文件夹是否具有写入权限

3

我想在 "d:\test\" 文件夹内写入文件,但很不幸,我没有该文件夹的写入权限。如何检查该文件夹是否具有写入权限。

注意:fopen()是有帮助的,但会创建新文件。我不想创建额外的文件。

我也看到了CreateFile(),但不知道如何在这种情况下使用它。


3
几乎唯一正确的测试方法是尝试编写代码,如果失败就进行修正。将测试与尝试分开几乎必然导致竞态条件。 - Jerry Coffin
没有尝试编写文件,还有其他方法吗? @jerry Coffin - bala
1
@bala 很抱歉,不行。另一个例子是当你有写入权限,但没有足够的空间时,即使你检查了权限,也无法创建一个一致的文件。是的,检查可用磁盘空间也会导致竞争条件。 - mike.dld
是的,你是对的 @mike.dld。谢谢你。 - bala
3个回答

2

只需打开(并写入)文件并分析系统返回的错误 (如果有的话),不需要执行检查操作以判断是否拥有权限。执行此操作将导致竞态条件,第一次调用告诉你可以创建一个文件,而第二次失败是因为在两次调用之间访问权限已更改。


至少在Windows上,您可以拥有创建文件的权限而没有删除文件的权限。这将导致大量过时的测试文件残留。 - RedX
在编程中,提前检查权限的缺失并且优雅地处理操作系统的错误/异常是明智之举。提前检查并不总是一个坏主意,这取决于你是否计划仅仅提前检查。 - KotoroShinoto

2

备选方案1:

你可以使用_access_access_s来检查文件是否具有权限。

更多信息在这里

00 Existence only
02 Write-only
04 Read-only
06 Read and write

备选方案 2:

由于您已经尝试使用CreateFile,请将dwDesiredAccess设置为GENERIC_WRITE,然后查看是否有错误。

更多详细信息在此

顺便提醒一下:如果您只需要检查文件(而不是写入/创建文件),请先删除临时文件(如果已存在)。


@bala 更新了带有 _access 的答案。 - Digital_Reality
你试过这个吗?对我来说不起作用。我用的是那个文件夹,但它没有写入权限。 - bala
@bala,你不能检查文件夹的权限... 但是只需将tempfilename附加到你现有的文件夹,并使用_access函数。(无论如何,文件不会被创建...)然后你只需要检查返回的代码。你试过这个吗? - Digital_Reality
如果临时文件名可用,则返回0,否则返回-1。 - bala

0

实际上,检查您是否具有写入权限的一种方法是使用安全访问函数。在那里,您可以查询所有不同的权限(删除、创建、写入、索引...)

我从未使用过它们,所以无法为您提供示例。

请记住,在检查访问权限并创建文件或写入之间可能会发生访问权限变更,因此仍可能失败。这就是其他人提到的竞态条件。

如果您最终仍要创建文件,请像其他人提到的那样使用CreateFile


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接