2013-05-31 147 views
1

我有下面的应用程序。为了让读者更容易测试,我稍作修改。我注意到,当我使用扩展名设置文件名时,例如test.txt,txt扩展名被对话框删除。不过,我希望用户能够指定扩展名,更重要的是我希望能够设置扩展名。在我看来,破解它的一种方法是根据我的扩展名修改过滤器。这是唯一的方法吗?SaveFileDialog从设置文件名中删除扩展名

我正在使用VS 2010 Express。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Globalization; 
using System.IO; 
using System.Windows; 
namespace SpeedDating 
{ 
    partial class Program 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      Form form = new Form(); 
      form.WindowState = FormWindowState.Minimized; 
      form.ShowInTaskbar = false; 
      form.TopMost = true; 
      form.Show(); 

      string filename = "test.txt"; 
      string ext = filename.Substring(filename.LastIndexOf('.')); 
      SaveFileDialog dialog = new SaveFileDialog(); 
      dialog.Title = "SpeedDating App"; 
      dialog.RestoreDirectory = true; 
      dialog.CheckFileExists = false; 
      dialog.CheckPathExists = false; 
      dialog.SupportMultiDottedExtensions = true; 
      dialog.AddExtension = false; 
      dialog.Filter = "All files (*.*)|*.*"; 
      dialog.FileName = DateTime.Now.ToString("yyyyMMdd") + ext; 

      DialogResult result = dialog.ShowDialog(); 
      if (result == DialogResult.OK && dialog.FileName != "") 
      { 
       try 
       { 
        FileStream outfs = File.Create(dialog.FileName); 
        FileStream infs = File.Open(filename, FileMode.Open); 
        infs.CopyTo(outfs); 
        infs.Close(); 
        outfs.Close(); 

        MessageBox.Show(form, "Copied file."); 
       } 
       catch (NotSupportedException ex) 
       { 
        MessageBox.Show(form, "Probably removed the original file."); 
       } 
      } 
      else if (result != DialogResult.Cancel) 
      { 
       MessageBox.Show(form, "No path found to write to."); 
      } 

      form.Close(); 
     } 
    } 
} 
+0

我复制了您的代码,并且仅更改了消息框中对“表单”的引用。这对我来说可以。我总是得到我输入对话框的确切文件。 – DonBoitnott

+0

不是我认为它引起任何问题,但是无论如何,“form”对象的目的是什么?它是空的,什么都不做。你不需要固定你所知道的MessageBox。 – DonBoitnott

+0

在我的系统上,我发现该对话框遵循用户在操作系统级别设置的任何内容。如果扩展名在文件浏览器中隐藏,那么它们也会隐藏在对话框中,而相反的情况也是如此。 –

回答

3

,更重要的是我希望能够设置扩展

您可以设置.DefaultExt().AddExtension().Filter(),和.FilterIndex()属性:

 string filename = "test.xyz"; 

     SaveFileDialog dialog = new SaveFileDialog(); 
     dialog.Title = "SpeedDating App"; 
     dialog.RestoreDirectory = true; 
     dialog.CheckFileExists = false; 
     dialog.CheckPathExists = false; 
     dialog.SupportMultiDottedExtensions = true; 
     dialog.Filter = "All files (*.*)|*.*"; 

     dialog.DefaultExt = System.IO.Path.GetExtension(filename); 
     if (dialog.DefaultExt.Length > 0) 
     { 
      dialog.AddExtension = true; 
      dialog.Filter = dialog.DefaultExt + " files (*." + dialog.DefaultExt + ")|*." + dialog.DefaultExt + "|" + dialog.Filter; 
      dialog.FilterIndex = 0; 
     } 

     dialog.FileName = DateTime.Now.ToString("yyyyMMdd"); 

     DialogResult result = dialog.ShowDialog(); 
     if (result == DialogResult.OK && dialog.FileName != "") 
     { 
      Console.WriteLine(dialog.FileName); 
     } 

*请注意,如果在文件资源管理器中关闭显示“文件扩展名”的选项,那么对话框也将隐藏扩展名... 但是上述设置会将设置的扩展名添加到.FileName()值由对话框返回。

+0

非常感谢! – RobotRock