C#创建临时文件,写入,打印,然后删除

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)

Yel*_*yev 6

你混合了两个概念:FileStreamFile.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)


Ren*_*ogt 5

除了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