saveFileDialog生成2个文件而不是1个?

时间:2016-01-27 16:13:55

标签: c# savefiledialog

我不明白为什么这会生成2个文件而不是1个: 具有相同的名称,但是一个(即可以)具有正确的扩展名(extension)并且是xxxxBytes,而另一个没有扩展名(文件类型是)并且是0Bytes。

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 个答案:

答案 0 :(得分:2)

从SaveFileDialog.OpenFile方法的MSDN页面

  

出于安全考虑,此方法使用。创建一个新文件   选择名称并使用读/写权限打开它。这可能会导致   如果选择要保存到

的现有文件,则会意外丢失数据

所以这一行

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

创建一个名为selected且零字节的文件。然后,您的代码继续在AES.Encryptfile调用中创建文件,其名称为fileOut

你可以简单地写

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

答案 1 :(得分:1)

您混淆的主要原因是您拥有Explorer选项"隐藏已知文件类型的扩展名"启用。如果您正在处理文件,请立即停用。

此外,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!");
}