保存文件对话框生成 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);
从 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!");
}