当我尝试使用C#保存图像文件时,如何修复“ UnauthorizedAccessException”?

时间:2019-08-03 00:01:53

标签: c# selenium exception file-access

我正在使用C#和Selenium IWebDriver,我试图拍摄屏幕图像并将文件保存到项目文件夹级别的名为“ Screenshots”的文件夹中。

我尝试使用methodSetAccessRule()设置目录的访问规则 我想尝试“ SaveAsFile”以外的其他方法

public class Helper
{
           public static void TakeScreenshot(string value)
        {
            IWebDriver driver;
            driver = DriverFactory.setDriver("Chrome");
            driver.Navigate().GoToUrl(value);
            Screenshot ss = ((ITakesScreenshot)driver).GetScreenshot();
            ss.SaveAsFile(Helper.GetScreenShotDirectory(), ScreenshotImageFormat.Png);

        }

        public static string GetScreenShotDirectory()
        {
            string cur = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string screenshotDir = Path.Combine(cur, @"..\..\","Screenshots");
            SetAccessRule(screenshotDir);
            return screenshotDir;
        }

       public static void SetAccessRule(string directory)
        {
            System.Security.AccessControl.DirectorySecurity sec = System.IO.Directory.GetAccessControl(directory);
            FileSystemAccessRule accRule = new FileSystemAccessRule(Environment.UserDomainName + "\\" + Environment.UserName, FileSystemRights.FullControl, AccessControlType.Allow);
            sec.AddAccessRule(accRule);
        }
}

我希望takeScreenshot方法中的SaveAsFile函数应该将文件保存在screenshotDir目录中。 相反,我得到UnauthorizedAccessException,目录被拒绝

2 个答案:

答案 0 :(得分:1)

得到System.UnauthorizedAccessException的原因是您试图用.png文件覆盖Screenshots目录。

// Install-Package Selenium.WebDriver
// Install-Package Selenium.WebDriver.ChromeDriver -Version 75.0.3770.140
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.IO;
using System.Reflection;
using System.Security.AccessControl;

namespace Selenium_Screenshot_SaveAsFile
{
    public class DriverFactory
    {
        public static IWebDriver setDriver(string name)
        {
            return new ChromeDriver();
        }
    }

    public class Helper
    {
        public static void TakeScreenshot(string value)
        {
            IWebDriver driver;
            driver = DriverFactory.setDriver("Chrome");
            driver.Navigate().GoToUrl(value);
            Screenshot ss = ((ITakesScreenshot)driver).GetScreenshot();

            // This succeeds because it's saving to a file...
            ss.SaveAsFile(Path.Combine(Helper.GetScreenShotDirectory(), "Hello, world!.png"), ScreenshotImageFormat.Png);

            // System.UnauthorizedAccessException because it's trying to overwrite a directory...
            ss.SaveAsFile(Helper.GetScreenShotDirectory(), ScreenshotImageFormat.Png);

        }

        public static string GetScreenShotDirectory()
        {
            string cur = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string screenshotDir = Path.Combine(cur, @"..\..\", "Screenshots");
            SetAccessRule(screenshotDir);
            return screenshotDir;
        }

        public static void SetAccessRule(string directory)
        {
            System.Security.AccessControl.DirectorySecurity sec = System.IO.Directory.GetAccessControl(directory);
            FileSystemAccessRule accRule = new FileSystemAccessRule(Environment.UserDomainName + "\\" + Environment.UserName, FileSystemRights.FullControl, AccessControlType.Allow);
            sec.AddAccessRule(accRule);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Helper.TakeScreenshot("https://stackoverflow.com/");
        }
    }
}

答案 1 :(得分:0)

几件事:

  1. 您只是更新内存中的DirectorySecurity,但没有将权限保存回目录。

例如,请查看Directory.GetAccessControl文档中的示例:

public static void AddDirectorySecurity(string FileName, string Account, FileSystemRights Rights, AccessControlType ControlType)
{
    // Create a new DirectoryInfo object.
    DirectoryInfo dInfo = new DirectoryInfo(FileName);

    // Get a DirectorySecurity object that represents the 
    // current security settings.
    DirectorySecurity dSecurity = dInfo.GetAccessControl();

    // Add the FileSystemAccessRule to the security settings. 
    dSecurity.AddAccessRule(new FileSystemAccessRule(Account,
                                                    Rights,
                                                    ControlType));
    // Set the new access settings.
    dInfo.SetAccessControl(dSecurity);
}

要将更新的权限写回到文件系统,它将调用DirectoryInfo.SetAccessControl。您也需要这样做。像这样:

public static void SetAccessRule(string directory)
{
    var dInfo = new DirectoryInfo(directory);
    System.Security.AccessControl.DirectorySecurity sec = dInfo.GetAccessControl();
    FileSystemAccessRule accRule = new FileSystemAccessRule(Environment.UserDomainName + "\\" + Environment.UserName, FileSystemRights.FullControl, AccessControlType.Allow);
    sec.AddAccessRule(accRule);

    dInfo.SetAccessControl(sec);
}
  1. 如果您运行的帐户没有将文件写入目录的权限,那么它真的有权更改权限吗? (有可能...不太可能)
相关问题