Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 拒绝访问!?我无法从C驱动器上的安装文件夹中打开文件_C#_Windows_Winforms_Directory_Itext - Fatal编程技术网

C# 拒绝访问!?我无法从C驱动器上的安装文件夹中打开文件

C# 拒绝访问!?我无法从C驱动器上的安装文件夹中打开文件,c#,windows,winforms,directory,itext,C#,Windows,Winforms,Directory,Itext,我做错了什么 我有一个读取/复制/写入进程,可以访问随软件安装的文件夹 这在测试构建时非常有效,但一旦创建了解决方案,它就完全停止工作。我做错了什么 (代码细目) 我基本上访问了一个名为CTW.PDF的PDF文件 接下来,我们创建一个临时副本,由软件填充并展开 完成后,软件用新名称将新副本保存到同一目录中(我只需在文件名中添加时间和日期) 代码如下: if (screenLock.Text == "") { } else { string fileNameExisting = @"C:

我做错了什么

我有一个读取/复制/写入进程,可以访问随软件安装的文件夹

这在测试构建时非常有效,但一旦创建了解决方案,它就完全停止工作。我做错了什么

(代码细目) 我基本上访问了一个名为CTW.PDF的PDF文件 接下来,我们创建一个临时副本,由软件填充并展开 完成后,软件用新名称将新副本保存到同一目录中(我只需在文件名中添加时间和日期)

代码如下:

if (screenLock.Text == "")
{

}
else
{
    string fileNameExisting = @"C:\Program Files (x86)\Compliance Pro 2\CTW.pdf";
    string fileNameNew = @"C:\Program Files (x86)\Compliance Pro 2" + " CTW.pdf" + DateTime.Now.ToString("M/d/yyyy") + DateTime.Now.ToString("hh:mm:ss");

    using (var existingFileStream = new FileStream(fileNameExisting, FileMode.Open))
    using (var newFileStream = new FileStream(fileNameNew, FileMode.Create))
    {
        // https://www.codeproject.com/Tips/679606/Filling-PDF-Form-using-iText-PDF-Library 
        // Open existing PDF
        var pdfReader = new PdfReader(existingFileStream);
        // PdfStamper, which will create
        var stamper = new PdfStamper(pdfReader, newFileStream);
        var form = stamper.AcroFields;
        var fieldKeys = form.Fields.Keys;
        foreach (string fieldKey in fieldKeys)
        {
           form.SetField(fieldKey, "");
        }
        stamper.AcroFields.SetField("OSJNonOSJ", "TFSN");
        stamper.AcroFields.SetField("Branch", "9DCF");
        stamper.AcroFields.SetField("User Name Last First", "Joe" + "Pearson");
        stamper.AcroFields.SetField("Tested by Last First", emailTo.Text);
        stamper.AcroFields.SetField("Date Tested", DateTime.Now.ToString("M/d/yyyy"));
        stamper.AcroFields.SetField("COMMENTS", notes.Text);
        stamper.AcroFields.SetField("WDE-Yes", user.Text + "5");
    }
}

注意:我非常努力地确保我的软件不需要任何管理权限来完成它的功能,我也希望在这里避免这种情况

将文件直接放入C:\或甚至尝试rwrite都是一个糟糕的选择。实际上,Windows驱动器的每个相关文件夹都受到保护,所以您至少需要管理员权限才能对其进行写入。如果没有这些,您甚至无法获得对程序目录的写入权限(即使您可以做到这一点,也不应该将数据放在那里)


如果您想要一个可以写入和存储数据的地方,请查看。特别是Userprofile特定文件夹的设计使您可以作为普通用户访问。如果数据在用户之间共享,则使用Publics One,否则使用Profile One。

错误行是尝试读取现有文件的行

您收到指定的错误,因为您正在从受保护的位置读取数据,但未指定您只想读取数据。它正在尝试锁定文件,这需要提升的权限

将读取操作的行更改为使用
FileAccess.Read
。它应该清除这个障碍。
当我创建本地控制台应用程序而不是以管理员身份运行时,我会遇到同样的错误。但是如果我添加下面的代码,它就可以正常工作

using (var existingFileStream = new FileStream(fileNameExisting, FileMode.Open, FileAccess.Read))

然后,您需要确定如何最好地写入该文件,由于其他人提到的原因,根本不应在
程序文件中写入该文件。

我添加了一个映像以供参考通常C:\驱动器需要管理员权限才能写入。这可能就是为什么会出现
AccessDenied
错误?有没有更干净的解决方案?我只是想把这个PDF文件拉出来,写在上面,然后保存到某个地方(我不在乎保存在哪里,它甚至可以是用户定义的),首先试着找出你的问题所在。这里有一些提示;A) 从您的帐户有权访问的位置打开/保存文件。然后,B)使用C:\位置,但尝试从管理员帐户运行代码。这将让你验证这是否是一个权限问题,这几乎可以肯定。自从Vista问世以来,你不应该在运行时写入程序文件xxx。改为写入程序数据或AppData。即使它以前工作过,也不正确。但是,有问题的实际错误是从
%ProgramFiles(x86)%
下的文件读取的。是否有最适合托管软件目录的位置?也许您有一个成功使用的首选文件夹?可能是您遇到了VirtualSization()。实际上,任何事情都是可能的,因为您首先尝试访问该文件夹。你甚至不应该尝试,除了安装程序。只需将该文件放入属于该用户的SpecialFolders中,您就不会有访问问题。如果有问题,很可能是管理问题。如果我直接访问用户\文档怎么办?这有可能吗?如果你使用特殊文件夹,访问该文件夹是很简单的。您可以通过“MyDocuments”键找到它。正如我已经说过的,拥有这个用户运行的任何程序的全部权限是他们的目的。虽然这是一个好地方,但我怀疑在下一行OP试图打开第二个文件以进行写入时,它会失败。我没有看到关于文件锁定的任何内容。但是需要说明的是,没有
access
参数的构造函数默认为
ReadWrite
access。这需要管理员登录,除非应用程序的安装程序另行设置了安全描述符。