没有加密整个文件夹和多个文件

时间:2016-05-23 10:13:28

标签: c# encryption

我正在开发加密/解密程序,我做到了。但我有一个问题,我无法找到它。问题是一次只加密一个文件而不是多个。我厌倦了选择多个文件但只加密第一个文件。我也可以加密整个文件夹。在代码中需要帮助。你能告诉我以下代码中的问题在哪里吗?

private void encryptbtn_Click(object sender, EventArgs e)
    {
        SaveFileDialog sfd = new SaveFileDialog();
        sfd.Title = "Encrypt To: ";
        sfd.Filter = "All Files(*.*)| *.*";
        sfd.FileName = "_ENC" + safepath;

        if(sfd.ShowDialog() == DialogResult.OK){


            if(pathtxt.Text != string.Empty){

                string inputFilePath = pathtxt.Text;

                string outputfilePath = sfd.FileName;

                string EncryptionKey = "MAKV2SPBNI99212";
                using (Aes encryptor = Aes.Create())
                {
                    Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
                    encryptor.Key = pdb.GetBytes(32);
                    encryptor.IV = pdb.GetBytes(16);
                    using (FileStream fsOutput = new FileStream(outputfilePath, FileMode.Create))
                    {
                        using (CryptoStream cs = new CryptoStream(fsOutput, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                        {
                            using (FileStream fsInput = new FileStream(inputFilePath, FileMode.Open))
                            {
                                int data;
                                while ((data = fsInput.ReadByte()) != -1)
                                {
                                    cs.WriteByte((byte)data);
                                }
                            }
                        }
                    }
                }

                MessageBox.Show("Encryption Successful");
                pathtxt.Text = string.Empty;
            }

2 个答案:

答案 0 :(得分:0)

你只得到第一个文件而不是多个文件的原因是因为SafeFileDialog不支持多个文件(这没有多大意义,不是吗?)。

相反,您可以使用目录中的所有文件指定多个输入文件(使用FolderBrowserDialog选择目录,并使用System.IO.Directory.GetFiles或{{获取所有文件1}})或明确指定文件(使用System.IO.Directory.EnumerateFiles,设置FileOpenDialog并使用Multiselect = true)。

然后,您可以使用FileNames提供的各种方法自动构建输出文件名。

System.IO.Path

答案 1 :(得分:0)

我想循环浏览多个文件,然后有几种方法可以做到这一点

首先使用OpenFileDialog:注意还有其他OpenFileDialog具有simlar功能,但根据WPF,Siverlight,ASP.net,Winforms

的不同而略有不同

这有一个Multiselect和FileNames属性

如果您使用这些,那么您可以

OpenFileDialog open = new OpenFileDialog()
{
    Multiselect =true
};
if(open.ShowDialog()==DialogResult.OK)
{
    foreach(var file in open.FileNames )
    {
        Encypt(file);
    }
}

另一种选择是使用目录

DirectoryInfo dir = new DirectoryInfo(DirPath);

foreach(var file in dir.EnumerateFiles("Filter")
{
    Encypt(file);
}

如果您使用的是winforms或任何其他类似的对话框,则可以使用pathtxt.Text

FolderBrowserDialog获取dirpath

如果你想将多个文件加密到一个文件,那么我建议首先压缩它们,然后加密压缩流,因为在使用多个流时尝试将文件分离出来是非常困难的