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