我有一个读取/复制/写入进程,可以访问随软件安装的文件夹。
这在测试构建时效果很好,但一旦创建了解决方案,它就完全停止工作了。我究竟做错了什么?
(代码分解) 我基本上访问了一个名为 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 驱动器的每个相关文件夹都受到保护,因此您至少需要管理权限才能写入它们。没有这些,您甚至无法获得对程序目录的写权限(即使您可以这样做,您也不应该将数据放在那里)。
如果您想要一个可以写入和存储数据的地方,请查看 SpecialFolders .特别是 Userprofile 特定文件夹经过专门设计,因此您应该可以作为普通用户访问。如果数据在用户之间共享,则使用 Publics,否则使用 Profile。
关于c# - 拒绝访问!?我无法从 C 驱动器上的安装文件夹中打开文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46204836/