这个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());

这个C#/XML代码中的内容锁定了文件/导致对另一个进程的访问被拒绝

我看不出是哪条语句导致了阻塞,但就在几天前,我遇到了一个非常相似的问题(在一个非常不同的场景中)。某个调用进程阻止了我的文件。我使用一个显式只读流解决了这个问题。我的是一个字节流,但对你来说这可能有效:

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (StreamReader rs = new StreamReader(fs))
                {
                    string allText = rs.ReadToEnd();
                }
            }