2016-01-27 3 views
0

Я не понимаю, почему это генерирует 2 файла вместо одного: имеют одинаковые имена, но один (это нормально) имеет правильное расширение (extension) и является xxxxBytes, в то время как у другого нет расширения (тип файла есть) и 0Bytes.saveFileDialog генерирует 2 файла вместо 1?

Stream my1Stream; 
SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 

saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; 
saveFileDialog1.FilterIndex = 2; 
saveFileDialog1.RestoreDirectory = true; 

if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
{ 
    if ((my1Stream = saveFileDialog1.OpenFile()) != null) 
    { 
     fileout = saveFileDialog1.FileName + extension;  
     passwordBytes = GetPasswordBytes(); 
     my1Stream.Close(); 
     AES.EncryptFile(filein, fileout, passwordBytes); 
     MessageBox.Show("File Criptato!"); 
    } 
} 

расширение происходит от filein (в OpenFileDialog) и объявлены в следующем виде: private string extension:

filein = openFileDialog1.FileName; 
extension = Path.GetExtension(filein); 

ответ

2

На странице MSDN по методу SaveFileDialog.OpenFile

Для целей безопасности, этот метод создает новый файл с выбранным именем и открывает его разрешения на чтение/запись. Это может привести к непреднамеренной потери данных, если вы выбираете существующий файл для сохранения

Так что линии

if ((my1Stream = saveFileDialog1.OpenFile()) != null) 

создает файл с именем, выбранным и с нулевыми байтами. Тогда ваш код продолжает создавать файл в вызове AES.Encryptfile с именем TNE из fileOut

Вы могли бы просто написать

if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
{ 
    fileout = saveFileDialog1.FileName;  
    passwordBytes = GetPasswordBytes(); 
    AES.EncryptFile(filein, fileout, passwordBytes); 
    MessageBox.Show("File Criptato!"); 
} 
1

Основная часть вашей путаницы вызвана тем, что у вас есть возможность Проводника Включено «Скрыть расширения для известных типов файлов». Отключите это немедленно, если вы работаете с файлами.

Кроме того, my1Stream = saveFileDialog1.OpenFile() фактически создает файл, но вы никогда не записываете его в my1Stream. Это создает первый файл размером 0 байт с соответствующим расширением.

Тогда следующий код:

fileout = saveFileDialog1.FileName + extension; 
AES.EncryptFile(filein, fileout, passwordBytes); 

Пишет второй файл с двойным расширением.

Если ваша библиотека AES (или где вы скопировали AES.EncryptFile()) не поддерживает запись в потоки, просто удалите if ((my1Stream = saveFileDialog1.OpenFile()) != null) и материал расширения. SaveFileDialog.FileNameделает включает расширение:

if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
{ 
    fileout = saveFileDialog1.FileName; 
    passwordBytes = GetPasswordBytes(); 
    AES.EncryptFile(filein, fileout, passwordBytes); 
    MessageBox.Show("File Criptato!"); 
}