【问题标题】:Create and open temporary text file with C# Winforms使用 C# Winforms 创建和打开临时文本文件
【发布时间】:2019-01-15 14:43:31
【问题描述】:

我有一个收集和编译数据并显示在表单上的 winforms 应用程序。我希望用户能够单击一个按钮,该按钮基本上将该数据导出到一个 txt 文件,他们可以在其中打印或保存文本文件。

我知道using StreamWriter txtFile = File.CreateText(@"C:\path\Foo.txt"),我用它来生成错误日志和其他东西,但这可能不起作用,因为我不一定想创建一个新的永久文件。基本上,我想要的是:

用户单击一个按钮,然后记事本弹出一些信息(基于存储在变量中的内容)。然后,用户可以决定是否要保存它或打印它或其他什么。当他们关闭它时,系统会提示他们保存(就像记事本一样),然后如果他们选择不保存,文件就会消失。如果我使用上面的代码,每次用户单击该按钮时都会创建一个新文件,我不希望这样,因为我的驱动器将充满 10,000 个文本文件。

E:好的,有几个人建议使用此解决方案:

SendMessage to Notepad++ in C#

但这对我不起作用。我复制了代码,放入一个按钮,将Notepad++ 更改为Notepad,但它不起作用。我添加了适当的using 行。还是行不通。我并不是说这不是解决方案,我只是说我无法让它发挥作用。

【问题讨论】:

  • 您可以先将文件保存到您的磁盘,如果用户不想保存,只需将其删除即可。
  • this 怎么样?
  • 为什么不给用户一个保存对话框提示?
  • @stuartd 链接和我显示的副本是等效的。两者都包含相同的解决方案。

标签: c# winforms


【解决方案1】:

您可以执行以下操作,使用剪贴板并管理“notepad.exe”进程(它应该适用于任何文本编辑器):

1) 添加此引用:

    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);

2) 打开记事本并粘贴数据:

public void OpenNotepad()
{
    Clipboard.SetText("All your text");

    Process process = Process.Start("notepad.exe");
    process.WaitForInputIdle();
    SetForegroundWindow(process.MainWindowHandle);
    SendKeys.Send("^V");
}

请注意,这不会创建任何临时文件,但我认为这是您想要的行为。

【讨论】:

  • 这正是我正在寻找的行为!只需弹出该记事本并用一些东西填充它。现在我只需要弄清楚如何使用记事本进行换行和处理,我会的。
【解决方案2】:

第一个选项: 我建议向用户显示一个保存对话框。

阅读文档:https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-save-files-using-the-savefiledialog-component

   // Displays a SaveFileDialog so the user can save the Image  
   // assigned to Button2.  
   SaveFileDialog saveFileDialog1 = new SaveFileDialog();  
   saveFileDialog1.Filter = "Text Image|*.txt";  
   saveFileDialog1.Title = "Save the File";  
   saveFileDialog1.ShowDialog();  

   // If the file name is not an empty string open it for saving.  
   if(saveFileDialog1.FileName != "")  
   {   
       /// Write a text file here at path saveFileDialog1.FileName
   }

第二个选项(如果您仍想坚持使用临时文件):

我建议使用临时文件夹。

   string windowsTempPath = Path.GetTempPath();

   var filePath = Path.Combine(windowsTempPath, "file_" + DateTime.Now.ToFileTimeUtc() + ".txt");

   //// Write txt file

   //// For opening file, use Process.Start
   Process.Start(filePath);

这将启动默认程序来打开 txt 文件。你不会对记事本或记事本++有任何依赖。

希望这会有所帮助。

【讨论】:

  • 如果Path 不工作,我错过了什么程序集或using 语句?顺便问一下,在这种情况下,Path 是一个类吗?我仍在学习术语(如Class)的含义。
  • 路径在命名空间 System.IO 中。它是 .net 框架的一部分。
  • 我想坚持使用临时文件,但它不起作用。这是说filePath 变量不是有效路径。
  • 您是否将 {花括号内的文本替换为 DateTime.Now.ToFileTimeUTC() ?
  • 我有这个代码:var filePath = Path.Combine(windowsTempPath, "file_" + DateTime.Now.ToFileTimeUtc() + ".txt");,但它不起作用。说找不到指定的文件。
猜你喜欢
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 2020-06-06
  • 2016-04-16
  • 1970-01-01
相关资源
最近更新 更多