2016-01-27 26 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衍生(在打開文件對話框),並宣佈形式:private string extension

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

回答

2

從上SaveFileDialog.OpenFile方法

出於安全目的的MSDN頁面,此方法創建與 選擇名稱的新文件,並打開它讀/寫權限。這可能會導致 意外丟失數據的,如果你選擇一個現有的文件保存到

所以這條線

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

創建與選擇的名稱和零個字節的文件。那麼你的代碼繼續創造與fileOut

TNE名在AES.Encryptfile調用文件你可以簡單地寫

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!"); 
} 
相關問題