代码之家  ›  专栏  ›  技术社区  ›  Dylan Beattie

如何在C中检查file.delete()是否会成功而不进行尝试?

  •  30
  • Dylan Beattie  · 技术社区  · 17 年前

    在C中,System.io.file.delete(filepath)将删除指定的文件,或引发异常。如果当前用户没有删除文件的权限,则会引发UnauthorizedAccessException。

    我是否可以提前知道删除是否可能引发未授权的访问异常(即,查询ACL以查看当前线程的标识是否具有删除指定文件的权限?)

    我基本上想做的是:

    if (FileIsDeletableByCurrentUser(filePath)) {
        /* remove supporting database records, etc. here */
        File.Delete(filePath);
    }
    

    但我不知道如何实现fileIsDeletableByCurrentUser()。

    8 回复  |  直到 10 年前
        1
  •  11
  •   KV Prajapati    17 年前
        2
  •  17
  •   Matt Wilko kingecg    10 年前

    实施中的问题 FileIsDeletableByCurrentUser 这是不可能的。原因是文件系统是一个不断变化的项目。

    在对文件系统进行任何检查和下一个操作之间,可能会发生任何数量的事件。包括…

    • 文件权限可能更改
    • 文件可能被删除
    • 文件可能被其他用户/进程锁定
    • 可以删除文件所在的USB密钥

    你能写的最好的函数最合适的名字是 FileWasDeletableByCurrentUser .

        3
  •  8
  •   Dale    17 年前

    你试过了吗? System.IO.File.GetAccessControl(filename) 它应该返回一个包含该文件权限信息的文件安全性。

        4
  •  2
  •   Tim Joseph    17 年前

    严格来说,unauthorizedAccessException意味着路径是一个目录,因此可以使用system.io.path.getFileName(path)类型命令并捕获参数异常。

    但是,如果您想要更全面的解决方案,请使用dale halliwell提到的system.io.file.getaccesscontrol。

        5
  •  1
  •   Sébastien Sevrin    11 年前

    如上所述。 查找文件权限并与运行应用程序的用户进行比较。

    你也可以用这个围裙

    bool deletemyfile()  
    {  
        try  
        {  
            ...delete my file  
            return true;  
        }  
        catch  
        {  
            return false;  
        }  
    }
    

    如果它返回假,你知道它失败如果它返回真,那么..它工作了,文件不见了。不知道你到底想要什么,但这是我能想到的最好的

        6
  •  0
  •   Community Mohan Dere    9 年前

    当然,您可以使用system.io检查只读标志,也可以使用文件上的acl安全性和当前用户的安全性,但是就像Mehrdad在他的评论中所写的那样,在所有情况下,它都不会是完整的证明。因此,在任何时候都需要对异常情况进行异常处理(即使它只是 a top-level catch-all 记录/显示“意外问题”并终止应用程序)。

        7
  •  0
  •   codymanix    17 年前

    您应该获得该文件的访问控制列表(ACL)。

    但这并不一定意味着您可以实际删除它,因为仍然可以设置只读标志,或者另一个程序已锁定该文件。

        8
  •  0
  •   BBlake    17 年前

    似乎按以下顺序做事情比较容易:

    1. 获取您需要的关于该文件的任何信息,以便执行其他部分(删除数据库数据等)
    2. 尝试删除文件
    3. 如果成功删除了文件,则执行其余的“清理”工作。如果删除失败,请返回/处理异常等。
    推荐文章