解压时DotNetZip密码错误

时间:2017-10-04 08:55:41

标签: c# asp.net .net zip dotnetzip

场景:上传文件而不是使用DotNetZip使用密码保护来压缩文件,使用Membership.GeneratePassword()方法生成密码。一切正常,但有时用户无法使用生成的密码解压缩文件。有线的事情是这种情况有时只会发生15次中的1次。 生成密码:

public static String FilePassword()
{
    while (_filePassword.Length < 12)
    {
        _filePassword += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit));
    }

    return _filePassword;
}

保存文件:

if (FileUploadControl.HasFile)
{

    fileName = Path.GetFileName(FileUploadControl.FileName);
    FileUploadControl.SaveAs(FileSavePath + fileName);

        // Archive uploaded file to zip.
        using (ZipFile zip = new ZipFile())
        {
            // File to be archived.
            var file = FileUploadControl.PostedFile;

            // Enable encryption of file
            zip.Encryption = EncryptionAlgorithm.PkzipWeak;

            // Set password.
            zip.Password = Settings.FilePassword();

            // Set temporary folder path for archive process.
            zip.TempFileFolder = tempPath;

            // Add file to archive with its path.
            zip.AddFile(FileSavePath + file.FileName, "");

            File objFile = new File(file.FileName, FileSavePath); 

            // Save zip file with the name as file ID.
            zip.Save(FileSavePath + file.FileName);
        }
}

我在创建方法时记录密码,同时在保护zip文件时也用密码,它们总是匹配,我看不出有什么问题,为什么有时在解压缩文件时显示错误的密码。

1 个答案:

答案 0 :(得分:1)

为什么在_filePassword中使用静态全局变量FilePassword()而不是范围中的一个?

这种方式可以从外部修改,或者甚至可以包含最后使用的值。如果没有lock,它也不是线程安全的。

使用局部变量进行结算,应该没问题。

public static String FilePassword()
{
    string retString = string.Empty;
    while (retString.Length < 12)
    {
        retString += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit));
    }    
    return retString;
}

您也可以记录返回值。

了解

的示例
if (FileUploadControl.HasFile)
{

    fileName = Path.GetFileName(FileUploadControl.FileName);
    FileUploadControl.SaveAs(FileSavePath + fileName);
    string filePassword = Settings.FilePassword(); // Contains the Password

    using (ZipFile zip = new ZipFile())
    {
        var file = FileUploadControl.PostedFile;
        zip.Encryption = EncryptionAlgorithm.PkzipWeak;            
        zip.Password = filePassword; // <-- Set password for ZIP
        zip.TempFileFolder = tempPath;
        zip.AddFile(FileSavePath + file.FileName, "");
        File objFile = new File(file.FileName, FileSavePath);
        zip.Save(FileSavePath + file.FileName);
    }

    // Log this value!
    Log(filePassword);
}