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

问题描述:

enter image description here我在做什么错了?访问被拒绝!?我无法从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"); 
    } 
} 

注:我很努力,以确保我的软件不需要任何管理权限来完成它的功能,我真的想在这里避免这种情况以及。

+0

我已经添加了图片以供参考 –

+1

通常C:\驱动器确实需要管理员权限才能写入。这可能是你为什么得到'AccessDenied'错误? – Sach

+0

是否有更清洁的解决方案?我只是想拉这个PDF,写下来,并保存在某个地方(我不在乎我保存的位置,它甚至可以由用户定义) –

将文件直接放入C:\或者甚至试图写入,这是一个糟糕的选择。几乎所有Windows驱动器的相关文件夹都受到保护,因此您至少需要Adminsitrative Privileges才能写入它们。没有这些,你甚至不能将程序目录写入权限(即使你可以这样做,你也不应该把数据放在那里)。

如果您想要一个可以编写和存储数据的地方,请参阅SpecialFolders。特别是用户配置文件特定文件夹的设计使您能够以普通用户的身份进行访问。如果数据在用户之间共享,则使用Publics,否则使用Profile。

+1

然而,在'%ProgramFiles(x86)%'下的一个文件中读取的实际错误呢? –

+0

有没有最适合托管软件目录的位置?也许你有一个你已经成功的首选文件夹? –

+0

可能是你遇到了Virtualsiation(http://www.thecodeking.co.uk/2007/03/making-your-application-uac-aware.html)。真的什么都是可能的,因为你试图首先访问该文件夹。除了安装程序,您甚至不应该尝试。只需将该文件放入属于该用户的SpecialFolders中,您将有0次访问问题。如果有任何问题,这是一个合理的管理问题。 – Christopher

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

由于您正在从受保护的位置读取数据,但未指定您只想读取数据,所以您正在收到指定的错误。它试图锁定需要提升特权的文件。

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

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

然后,你将需要确定如何最好地写入文件,不应在Program Files做到在所有的其他人提到的原因。

+0

虽然是个好地方,但我怀疑它会在下一行OP失败,并尝试打开第二个文件,意图是** ** – MickyD

+0

我没有在[文档](https: //msdn.microsoft.com/en-us/library/47ek66wy)关于文件锁定。但据说没有'access'参数的构造函数默认为'ReadWrite'访问。这需要管理员登录,除非安全描述符由应用程序的安装程序另行设置。 – eryksun