听起来像只读文件,对吧?不是真的。
所以我的目标是通过简单地将它们压缩为.zip文件来备份我构建的应用程序中的所有文件。
首先,我收集所有文件并将它们放在另一个文件夹中(例如,我不需要备份.exe文件)。然后我使用IO.compression.ZipFile
ZipFile.CreateFromDirectory(backupDirectory, ZipDirectory);
稍后,当用户想要恢复备份时,我首先删除现有的文件和目录,然后将其解压缩:
ZipFile.ExtractToDirectory(openFileDialog1.FileName, installDirectory);
问题: 文件现在是只读的,一个文件是.mdf文件,我不能再对表进行更改,这使得应用程序无用。 我试过这样做:
public void Recurse(DirectoryInfo directory)
{
foreach (FileInfo fi in directory.GetFiles())
{
//fi.Attributes |= FileAttributes.ReadOnly; //this didn't work eather
fi.IsReadOnly = false;
}
foreach (DirectoryInfo subdir in directory.GetDirectories())
{
Recurse(subdir);
}
}
来自this question.的没有工作。而且我不希望它工作,因为“只读”'不在.mdf属性上检查标志。另外,在查看“安全”选项卡时:
SYSTEM,Admin和User是相同的,我缺少的是组名' Everyone'将所有检查设置为“允许”。 再次手动设置此组后,我看到了一些改进,但是仍然遇到其他错误,例如无法登录,用户登录失败[当前用户]
编辑:上述安全标签的问题是因为我使用了Recurse
方法。让事情变得更糟。因此,对所有文件使用file.IsReadOnly = false
不是一个好的解决方案。
问题:如何在不更改文件属性/设置/权限的情况下正确压缩和解压缩文件。 **或者:**解压后如何再次为文件设置正确的属性。
答案 0 :(得分:0)
我找到了解决方案。
在我提到的其他问题/解决方案中,he said要更改为fileinfo.IsReadOnly = false;
而不是:
fileInfo.Attributes = FileAttributes.Normal
对我来说,情况恰恰相反。
所以使用这个参数:
DirectoryInfo di = new DirectoryInfo(installDirectory);
Recurse(di);
我用过这个:
public void Recurse(DirectoryInfo directory)
{
foreach (FileInfo fi in directory.GetFiles())
{
fi.Attributes = FileAttributes.Normal;
}
foreach (DirectoryInfo subdir in directory.GetDirectories())
{
Recurse(subdir);
}
}
修改强>
经过一段时间试图找到更好的解决方案之后,我来了across this topic。这完全解决了它。