3 c#
我正在尝试创建一个临时文件,写入它,打印它,然后删除它.这是我的代码:
string filePathReceipt = Path.GetTempFileName();
try {
using (FileStream fs = new FileStream(filePathReceipt, FileMode.Open)) {
File.WriteAllText(filePathReceipt, dataToBeWritten.ToString());
}
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
//Printing receipt: start
ProcessStartInfo psi = new ProcessStartInfo(filePathReceipt);
psi.Verb = "PRINT";
try {
Process.Start(psi);
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
//Printing receipt: end
if (File.Exists(filePathReceipt)) {
//Delete the file after it has been printed
File.Delete(filePathReceipt);
}
Run Code Online (Sandbox Code Playgroud)
我收到异常消息说:
无法写入,因为它被另一个进程使用.
编辑#2:我发现这有效:
string filePathReceipt = AppDomain.CurrentDomain.BaseDirectory + @"receipt.txt";
虽然这会产生异常: string filePathReceipt = Path.GetTempFileName();
完整的,当前的代码:
//string filePathReceipt = AppDomain.CurrentDomain.BaseDirectory + @"receipt.txt";
string filePathReceipt = Path.GetTempFileName();
File.WriteAllText(filePathReceipt, dataToBeWritten.ToString());
ProcessStartInfo psi = new ProcessStartInfo(filePathReceipt);
psi.Verb = "PRINT";
try {
using (Process p = Process.Start(psi))
p.WaitForExit();
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
if (File.Exists(filePathReceipt)) {
//Delete the file after it has been printed
File.Delete(filePathReceipt);
}
Run Code Online (Sandbox Code Playgroud)
你混合了两个概念:FileStream
和File.WriteAllText
.
您打开文件流,然后使用File.WriteAllText
哪个尝试打开文件,但无法执行此操作.
更换:
using (FileStream fs = new FileStream(filePathReceipt, FileMode.Open)) {
File.WriteAllText(filePathReceipt, dataToBeWritten.ToString());
}
Run Code Online (Sandbox Code Playgroud)
与任何一个:
File.WriteAllText(filePathReceipt, dataToBeWritten.ToString());
Run Code Online (Sandbox Code Playgroud)
要么
// pay attention: it is FileMode.Create, not FileMode.Open
using (FileStream fs = new FileStream(filePathReceipt, FileMode.Create))
using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
{
sw.Write(dataToBeWritten.ToString());
}
Run Code Online (Sandbox Code Playgroud)
除了Yeldar 的回答......
您需要等待打印过程完成。您无法在启动该过程后的几毫秒内删除该文件。
等待该进程的直接方法是:
try {
using (Process p = Process.Start(psi))
p.WaitForExit();
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用Process
' 事件:
using(Process p = new Process())
{
p.StartInfo = psi;
p.EnableRaisingEvents = true;
p.HasExited += OnProcessExited;
}
Run Code Online (Sandbox Code Playgroud)
并在事件处理程序中处理该文件OnProcessExited
。