【问题标题】:ProgramData environment variable not recognized wixsharpProgramData 环境变量无法识别 wixsharp
【发布时间】:2021-11-30 10:48:35
【问题描述】:

我试图在卸载时删除一个文件夹,但它什么也没做。 但是指定路径,让它工作。 不工作:

 public void OnAfterInstall(SetupEventArgs e)
        {
            if (e.IsUninstalling)
            {
                
                DirectoryInfo dir = new DirectoryInfo(@"CommonAppDataFolder\myFolder");
                if ((bool)(dir?.Exists))
                {
                    dir?.Delete(true);
                }
                
            }
        }

工作:

public void OnAfterInstall(SetupEventArgs e)
        {
            if (e.IsUninstalling)
            {
                
                DirectoryInfo dir = new DirectoryInfo(@"C:\ProgramData\myFolder");
                if ((bool)(dir?.Exists))
                {
                    dir?.Delete(true);
                }
                
            }
        }

编辑: 我试过这段代码,我得到了同样的错误:

        var programFiles = Environment.ExpandEnvironmentVariables("%ProgramFiles%");
        var manifestFile = Path.Combine(programFiles,@"\My Company\myFile.man");

        FileInfo fInfo = new FileInfo(manifestFile);
        if ((bool)(fInfo?.Exists))
        {
            FileSecurity security = fInfo.GetAccessControl();
            security.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null),
                FileSystemRights.ReadAndExecute, AccessControlType.Allow));
            fInfo.SetAccessControl(security);
        }

        var CMDCommand = $@"/C wevtutil im {manifestFile}";
        Process.Start("CMD.exe", CMDCommand);

我也试过这个:

var programFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
    var manifestFile = programFiles + @"\My Company\myFile.man";

C:\ 上运行此代码运行良好..

【问题讨论】:

标签: c# wixsharp


【解决方案1】:

你应该扩展环境变量以获得实际路径

var common = Environment.ExpandEnvironmentVariables("%ProgramData%");
var yourFolder = Path.Combine(common, "myFolder");
DirectoryInfo dir = new DirectoryInfo(yourFolder);

注意如何从字符串中检索环境变量,您需要将字符串放在 % 之间,您还可以使用在机器上定义的所有环境变量(自定义或标准)获得一个哈希表

var envs = Environment.GetEnvironmentVariables();

还要考虑Hans Passant 在其评论中强调的替代方案(或者可能更好的选择)。 Environment.GetFolderPath 是一个接收枚举 SpecialFolder 并返回请求的特殊文件夹路径的方法。

这是一个更好的选择,因为它不依赖于可以更改或删除的环境变量,从而造成可能的错误情况。

var common = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);

【讨论】:

  • 感谢您的回答,虽然它不起作用。
  • 其实 Path.Combine(common, "myFolder");返回“我的文件夹”
  • 不确定是什么问题。当然,您应该有一个名为 %ProgramData% 的环境变量。可以用调试器检查 Environment.GetEnvironmentVariables 的返回值吗?
猜你喜欢
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 2017-05-17
  • 1970-01-01
相关资源
最近更新 更多