这个C#/XML代码中的内容锁定了文件/导致对另一个进程的访问被拒绝
本文关键字:另一个 进程 拒绝 访问 文件 锁定 代码 XML 这个 | 更新日期: 2023-09-27 17:57:44
这是本SO文章的后续内容,我成功地从WinForms应用程序对AML实现了AES加密,并从Windows服务对其进行了解密。只有当两个程序都可以使用c:''test.xml这样的文件时,才会出现这种情况。否则,我从Windows服务中得到了这个可怕的异常:
Unable to load configuration data. Access to the path 'C:'worl'Project Alpha'Code'AlphaConfigurationUtility'AlphaConfigurationUtility'bin'Debug'alphaService.xml' is denied.
显然,硬编码在Production中不起作用,但今天,我接受了WinForm和Windows Service项目,并让它们从同一目录中进行写入和读取。现在我又遇到了同样可怕的异常。
编辑:Windows服务是否存在权限问题?它使用管理员帐户运行
这段代码中的什么可能导致文件被锁定,以便从另一个程序(Windows服务程序)访问?
try
{
string fileName = System.IO.Path.Combine(Application.StartupPath, "alphaService.xml");
// var fileName = @"c:/text.xml";
XDocument doc = new XDocument();
XElement xml = new XElement("Info",
new XElement("DatabaseServerName", txtServerName.Text),
new XElement("DatabaseUserName", txtDatabaseUserName.Text),
new XElement("DatabasePassword", txtDatabasePassword.Text),
new XElement("ServiceAccount", txtAccount.Text),
new XElement("ServicePassword", txtServicePassword.Text),
new XElement("RegistrationCode", txtRegistrationCode.Text));
doc.Add(xml);
//using (var aes = Aes.Create())
//{
// aesKey = aes.Key;
// key = Convert.ToBase64String(aes.Key);
//}
string sKey = "LvtZELDrB394hbSOi3SurLWAvC8adNpZiJmQDJHdfJU=";
var aesKey = Convert.FromBase64String(sKey);
string encyptedText = EncryptDecrpt.EncryptStringToBase64String(doc.ToString(), aesKey);
File.WriteAllText(fileName, encyptedText);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
解密程序,Windows服务从开始并在文件上获得异常。ReadAllText:
string path = AppDomain.CurrentDomain.BaseDirectory;
eventLog1.WriteEntry(path);
string fileName = System.IO.Path.Combine(path, "alphaService.xml");
// var fileName = @"c:/text.xml";
string sKey = "LvtZELDrB394hbSOi3SurLWAvC8adNpZiJmQDJHdfJU=";
Byte[] keyBytes = Convert.FromBase64String(sKey);
var encryptedText = File.ReadAllText(fileName, new ASCIIEncoding());
我看不出是哪条语句导致了阻塞,但就在几天前,我遇到了一个非常相似的问题(在一个非常不同的场景中)。某个调用进程阻止了我的文件。我使用一个显式只读流解决了这个问题。我的是一个字节流,但对你来说这可能有效:
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader rs = new StreamReader(fs))
{
string allText = rs.ReadToEnd();
}
}