在 运行 我的应用程序的 Wix 安装程序之后无法 create/write 到 files/folders,即使在删除文件夹之后
Cannot create/write to files/folders after running a Wix Installer for my application, even after deleting folder
在我用于安装程序的 Product.wxs 文件中,我有一个功能可以在 ProgramData 中创建一些文件夹并向其中添加一些文件
<Feature Id="IOFilesFeature" Title="Settings and IO Files" Level="1">
<Feature Id="Languages" Title="Languages" Level="2">
<Feature Id="Languages_UK" Title="English" Level="3">
<ComponentGroupRef Id="ProgramData_MFR_PRD_Languages_UK" />
</Feature>
</Feature>
<Feature Id="OpsPC1" Title="Operator PC 1" Level="2">
<Feature Id="OpsPC1_Settings" Title="Settings" Level="3">
<ComponentGroupRef Id="ProgramData_MFR_PRD_Settings_Ops1" />
</Feature>
<Feature Id="OpsPC1_IO" Title="IO" Level="1">
<ComponentGroupRef Id="ProgramData_MFR_PRD_IO_Ops1" />
</Feature>
</Feature>
</Feature>
<Fragment>
<Directory Id="CommonAppDataFolder" Name="ProgramData">
<Directory Id="PD_MFR" Name="CompanyName">
<Directory Id="PD_MFR_PRD" Name="ProductName">
<Directory Id="PD_MFR_PRD_Languages" Name="Languages" />
<Directory Id="PD_MFR_PRD_Settings" Name="Settings" />
<Directory Id="PD_MFR_PRD_IO" Name="IO" />
</Directory>
</Directory>
</Directory>
</Fragment>
每个文件都与此类似:
<Fragment>
<ComponentGroup Id="ProgramData_MFR_PRD_IO_Ops1" Directory="PD_MFR_PRD_IO">
<Component Id="FileID" Guid="2be6ba39-9496-4985-8317-5bd0b3f88f95">
<File Id="FileID" Name="FileName" Source="SourceLocation" />
</Component>
</ComponentGroup>
</Fragment>
我在使用安装程序后发现该程序无法编辑这些文件。手动编辑只会在 windows 资源管理器中显示。当我从下面的代码读取文件内容后查看文件内容时,内容不会更新为我手动更改的内容。
public static string ReadFile(string fullPath)
{
string rv = "";
try
{
if (File.Exists(fullPath))
{
FileStream fs = new FileStream(fullPath, FileMode.Open, FileAccess.Read);
if (fs.CanRead)
using (StreamReader sr = new StreamReader(fs))
rv = sr.ReadToEnd();
}
}
catch (Exception ex)
{
ex.WriteToFile();
}
return rv;
}
我从 ProgramData 中删除了 CompanyName 文件夹,看看它是否允许程序重新创建文件并且程序仍然可以读取文件。 Windows 资源管理器会显示该文件夹不存在。
您知道是什么导致文件 "ghost" 这样吗?
一旦我发现它正在写入虚拟商店,我发现了这个:
Privileges/owner issue when writing in C:\ProgramData\
也就是说安装程序必须给子目录一个允许的ACL。
我按照 Wix: How to set permissions for folder and all sub folders 应用了这个,现在应用程序再次按预期运行。
在我用于安装程序的 Product.wxs 文件中,我有一个功能可以在 ProgramData 中创建一些文件夹并向其中添加一些文件
<Feature Id="IOFilesFeature" Title="Settings and IO Files" Level="1">
<Feature Id="Languages" Title="Languages" Level="2">
<Feature Id="Languages_UK" Title="English" Level="3">
<ComponentGroupRef Id="ProgramData_MFR_PRD_Languages_UK" />
</Feature>
</Feature>
<Feature Id="OpsPC1" Title="Operator PC 1" Level="2">
<Feature Id="OpsPC1_Settings" Title="Settings" Level="3">
<ComponentGroupRef Id="ProgramData_MFR_PRD_Settings_Ops1" />
</Feature>
<Feature Id="OpsPC1_IO" Title="IO" Level="1">
<ComponentGroupRef Id="ProgramData_MFR_PRD_IO_Ops1" />
</Feature>
</Feature>
</Feature>
<Fragment>
<Directory Id="CommonAppDataFolder" Name="ProgramData">
<Directory Id="PD_MFR" Name="CompanyName">
<Directory Id="PD_MFR_PRD" Name="ProductName">
<Directory Id="PD_MFR_PRD_Languages" Name="Languages" />
<Directory Id="PD_MFR_PRD_Settings" Name="Settings" />
<Directory Id="PD_MFR_PRD_IO" Name="IO" />
</Directory>
</Directory>
</Directory>
</Fragment>
每个文件都与此类似:
<Fragment>
<ComponentGroup Id="ProgramData_MFR_PRD_IO_Ops1" Directory="PD_MFR_PRD_IO">
<Component Id="FileID" Guid="2be6ba39-9496-4985-8317-5bd0b3f88f95">
<File Id="FileID" Name="FileName" Source="SourceLocation" />
</Component>
</ComponentGroup>
</Fragment>
我在使用安装程序后发现该程序无法编辑这些文件。手动编辑只会在 windows 资源管理器中显示。当我从下面的代码读取文件内容后查看文件内容时,内容不会更新为我手动更改的内容。
public static string ReadFile(string fullPath)
{
string rv = "";
try
{
if (File.Exists(fullPath))
{
FileStream fs = new FileStream(fullPath, FileMode.Open, FileAccess.Read);
if (fs.CanRead)
using (StreamReader sr = new StreamReader(fs))
rv = sr.ReadToEnd();
}
}
catch (Exception ex)
{
ex.WriteToFile();
}
return rv;
}
我从 ProgramData 中删除了 CompanyName 文件夹,看看它是否允许程序重新创建文件并且程序仍然可以读取文件。 Windows 资源管理器会显示该文件夹不存在。
您知道是什么导致文件 "ghost" 这样吗?
一旦我发现它正在写入虚拟商店,我发现了这个:
Privileges/owner issue when writing in C:\ProgramData\
也就是说安装程序必须给子目录一个允许的ACL。
我按照 Wix: How to set permissions for folder and all sub folders 应用了这个,现在应用程序再次按预期运行。