2015-06-13 9 views
0

Я пытался зашифровать файл hello.txt, но он не удался. Когда я зашифровать, это исключение:Доступ к пути запрещен (шифрование)

System.UnauthorizedAccessException: Access to the path 'C:\Users\username\Desktop' is denied. 
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) 
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access) 
at Encrypt.EncDec.Decrypt(String fileIn, String fileOut, String Password) in C:\Users\username\Documents\My Apps\Encrypt\Encrypt\Form1.cs:line 518 
at Encrypt.Form1.proceedEDfe(String input, String output, String key) in C:\Users\username\Documents\My Apps\Encrypt\Encrypt\Form1.cs:line 154 

Так вот мой код (line 154):

string inputE; 
    string outputE; 
    string pwdE; 

    private void ofd1_Click(object sender, EventArgs e) 
    { 
     if (ofd.ShowDialog() == DialogResult.OK) 
     { 
      inputE = ofd.FileName; 
     } 
    } 

    private void fbd1_Click(object sender, EventArgs e) 
    { 
     if(fbd.ShowDialog() == DialogResult.OK) 
     { 
      outputE = fbd.SelectedPath; 
     } 
    } 

    private void encryptF_Click(object sender, EventArgs e) 
    { 
     pwdE = keyE.Text; 
     if (inputE != null && outputE != null && pwdE != null) 
     { 
      proceedEDfe(inputE, outputE, pwdE); 
     } 
    } 
    private void proceedEDfe(string input, string output, string key) 
    { 
     try 
     { 
      EncDec.Decrypt(input, output, key); //line 154 
      doneStat.Text = "File decryption succeeded"; 
     } 
     catch (Exception ex) 
     { 
      doneStat.Text = "File decryption failed"; 
      MessageBox.Show(Convert.ToString(ex), "Error"); 
      doneStatTb.Text = Convert.ToString(ex); 
     } 
    } 

Я скопировал этот код из Code Project, метод EncDec класс Расшифровать это (line 518) :

// Decrypt a file into another file using a password 
    public static void Decrypt(string fileIn, string fileOut, string Password) 
    { 

     FileStream fsIn = new FileStream(fileIn, FileMode.Open, FileAccess.Read); 
     //line 518 
     FileStream fsOut = new FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write); 

     PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, 
      new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 
     0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 

     Rijndael alg = Rijndael.Create(); 

     alg.Key = pdb.GetBytes(32); 
     alg.IV = pdb.GetBytes(16); 

     CryptoStream cs = new CryptoStream(fsOut, 
      alg.CreateDecryptor(), CryptoStreamMode.Write); 

     int bufferLen = 4096; 
     byte[] buffer = new byte[bufferLen]; 
     int bytesRead; 

     do 
     { 
      bytesRead = fsIn.Read(buffer, 0, bufferLen); 
      cs.Write(buffer, 0, bytesRead); 

     } while (bytesRead != 0); 

     cs.Close(); 
     fsIn.Close(); 
    } 

Как это исправить? Что-то не так в коде?

+0

Является ли это обучение упражнения? Потому что важно отметить, что ** криптография действительно сложно сделать правильно **, и если вы пишете свои собственные алгоритмы шифрования (или переопределяете чужие) для чего-либо вне учебного упражнения, и у вас еще нет твердого фоном в поле, вы настраиваете себя на большие, большие проблемы на линии. –

ответ

0

Вы указали C:\Users\username\Desktop в качестве имени либо входной файл или выходного файла. Это, конечно, каталог, и ошибка говорит, что вы не можете читать или пишите в этот каталог, как если бы это был файл.

По-видимому, вы используете FolderBrowserDialog для выбора выхода. Конечно, этот диалог выбирает только каталоги. Я полагаю, что вы хотите сделать, это взять имя файла ввода и добавить его в выходной каталог. Поэтому, если ваш входной файл равен C:\Users\username\Input\somefile.txt, вы хотите, чтобы выходной файл был C:\Users\username\Desktop\somefile.txt. В этом случае вы должны использовать Path.GetFileName, чтобы получить имя файла входного файла (т. Е. Часть somefile.txt) и использовать Path.Combine, чтобы присоединиться к этому в выходной каталог.

Я сделал эти изменения в свой метод encryptF_Click, чтобы дать мне следующее:

private void encryptF_Click(object sender, EventArgs e) 
{ 
    pwdE = keyE.Text; 
    if (inputE != null && outputE != null && pwdE != null) 
    { 
     string outputFile = Path.Combine(outputE, Path.GetFileName(inputE)); 
     proceedEDfe(inputE, outputFile, pwdE); 
    } 
} 
+0

Я должен проверить строки 'inputE' и' outputE'? – newbieguy

+0

@cromix: Теперь я понял, что ваш 'fbd', скорее всего, является FolderBrowserDialog, поэтому это проблема, а не входной файл. По сути, вы выбираете каталог для записи вывода, но не указываете Windows, что вы хотите, чтобы имя файла в этом каталоге было. –

+0

Исключение: 'System.IO.IOException: процесс не может получить доступ к файлу 'D: \ hello.txt', потому что он используется другим процессом.' – newbieguy

Смежные вопросы