保存文件对话框生成 2 个文件而不是 1

本文关键字:文件 对话框 保存文件 | 更新日期: 2023-09-27 18:32:19

我不明白为什么这会生成 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);

保存文件对话框生成 2 个文件而不是 1

从 MSDN 页的 SaveFileDialog.OpenFile 方法

出于安全目的,此方法创建一个新文件,其中包含 选择名称,然后以读/写权限将其打开。这可能会导致 如果选择要保存到的现有文件,则意外丢失数据

所以这条线

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

创建名称为选定且为零字节的文件。然后,您的代码继续在 AES 中创建文件。使用 tne 名称加密文件调用fileOut

你可以简单地写

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

您混淆的主要原因是启用了资源管理器选项"隐藏已知文件类型的扩展名"。如果您正在处理文件,请立即禁用它。

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