2016-05-23 5 views
-1

暗号化/復号化プログラムを開発しています。しかし、私はそれを見つけることができない問題がありました。問題は1つのファイルだけが複数ではなく一度に暗号化されることです。私は複数のファイルを選択するのに疲れましたが、最初のファイルだけを暗号化しました。また、フォルダ全体を暗号化することもできます。コードの助けが必要です。次のコードのどこに問題があるのか​​教えていただけますか?フォルダ全体と複数のファイルを暗号化しませんでした

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; 
      } 
+0

'string outputfilePath = sfd.FileName;' 1ファイルのみです。代わりに 'FuleNames'を使用してください+ループ –

+0

問題は、あなたがファイルをどこでもループしていないことです。 – MikeT

+0

何をしようとしていますか?ディレクトリを暗号化して1つのファイルにしますか?またはそのディレクトリ内のファイルごとに1つのファイル?ダイアログで選択した複数のファイルを暗号化する – MikeT

答えて

0

SafeFileDialogは、複数のファイルをサポートしていないので、あなただけの代わりに、複数の最初のファイルがあります理由(あまり意味がありません、それでしょうか?)。

代わりに、あなたはFileOpenDialog、セットを使用します(ディレクトリ内のすべてのファイルを使用して(ディレクトリを選択し、System.IO.Directory.GetFilesまたはSystem.IO.Directory.EnumerateFiles持つすべてのファイルを取得するにはFolderBrowserDialogを使用)、または明示的にファイルを指定することのいずれかによって、複数の入力ファイルを指定することができますMultiselect = trueであり、FileNamesを使用してください)。

System.IO.Pathが提供するさまざまな方法で出力ファイル名を自動的に構築することができます。

string sourceDirectory = @"C:\TestInput\"; 
string destinationDirectory = @"C:\TestOutput\"; 

// or with OpenFileDialog.FileNames 
string[] inputFiles = System.IO.Directory.GetFiles(sourceDirectory) 

foreach(string inputfilePath in inputFiles) 
{ 
    string outputfilePath = System.IO.Path.Combine(destinationDirectory, 
     System.IO.Path.GetFileName(inputfilePath) + "_encrypted"); 

    //Encrypt here 
} 
+0

質問は複数の選択に関するものでした(複数のファイルを選択するのに疲れましたが、ファイルをフォルダに保存します。 –

+0

ほとんどの場合、列挙は列挙が使用されている間、バックグラウンド読み込みを続けることを許可するので、GetFilesではなくEnumerateFilesを使用する必要があります。 – MikeT

+0

コードコメント - OpenFileDialogでのアノテーションとして。FileNames(もちろんMultiSelectが有効になっています) –

0

複数のファイルをループにしたい私は、その後OpenFileDialogと、まずこの

を行うには、いくつかの方法があります。simlar機能を持っていますが、WPF場合によってはその詳細にわずかに変化する他のOpenFileDialogさんがあります注意してください、Siverlight、ASP.net、Winformsの

が、これは複数選択し、ファイル名のプロパティを持ってい

あなたはこれらを使用している場合、あなたは

を行うことができます
OpenFileDialog open = new OpenFileDialog() 
{ 
    Multiselect =true 
}; 
if(open.ShowDialog()==DialogResult.OK) 
{ 
    foreach(var file in open.FileNames) 
    { 
     Encypt(file); 
    } 
} 

別の選択は、あなたがpathtxt.Text

を使用し、あなたのコード内で、リサイズまたは他の同様のダイアログのいずれかを使用している場合は、 FolderBrowserDialogからDIRPATHを得ることができます

DirectoryInfo dir = new DirectoryInfo(DirPath); 

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

Directoryを使用することです

複数のファイルを1つのファイルに暗号化したい場合は、最初に圧縮した後、複数のストリームを使用するときに圧縮されたストリームを暗号化して暗号化することをお勧めします。

+0

ありがとう。私はあなたの助けに感謝します – singh

関連する問題