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

saveFileDialog generates 2 file instead 1?

我不明白为什么这会生成 2 个文件而不是一个: 具有相同的名称,但一个(可以)具有正确的扩展名 (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);

您之所以感到困惑,主要是因为您启用了资源管理器选项 "Hide extensions for known file types"。如果您正在处理文件,请立即禁用它。

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

来自 SaveFileDialog.OpenFile 方法的 MSDN 页面

For security purposes, this method creates a new file with the selected name and opens it with read/write permissions. This can cause unintentional loss of data if you select an existing file to save to

所以这一行

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

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

你可以简单地写

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