0

听起来像只读文件,对吧?不是真的。

所以我的目标是通过简单地将它们压缩为 .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);
        }
    }

这个问题。 没用。而且我不希望它起作用,因为没有在 .mdf 属性上检查“只读”标志。同样在查看“安全”选项卡时:

SYSTEM、Admin 和 User 是相同的,我缺少的是组名“Everyone”,所有检查都设置为 Allowed。再次手动设置此组后,我看到了一些改进,但仍然出现其他错误,例如无法登录,用户 [当前用户] 登录失败

编辑:上述安全选项卡的问题是因为我使用了该Recurse方法。让事情变得更糟。因此,使用file.IsReadOnly = falsefor all files 并不是一个好的解决方案。

问题:如何正确压缩和解压缩文件而不更改其属性/设置/权限。**或:** 解压缩后如何再次为文件设置正确的属性。

4

1 回答 1

0

我找到了解决方案。

在我提到的另一个问题/解决方案中,他说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);
    }
}

编辑:

经过一段时间试图找到更好的解决方案后,我遇到了这个话题。这完全解决了它。

于 2015-01-23T19:51:19.507 回答