【问题标题】:C# does not run or delete fileC# 不运行或删除文件
【发布时间】:2013-06-09 21:20:08
【问题描述】:

这个 C# 程序使一个批处理文件运行它,然后应该删除该文件。当我运行程序时,如果最后一个 if 语句不存在,它会生成批处理文件并完美地执行它。但是对于最后一个 if 语句,它会创建文件并将其删除但不进行任何更改。

 string batFile;
 batFile = genBat(textBox1.Text);
 string path = "C:\\Windows\\System32\\drivers\\etc\\blocksite.bat";

 using (StreamWriter sw = new StreamWriter(path))
 {
       sw.WriteLine(@batFile);
       sw.Close();
 }

       Process.Start(path);

 if(File.Exists(path))
 {
       File.Delete(path)
 }

【问题讨论】:

  • sw.WriteLine(@batFile); ???
  • batFile = genBat(textBox1.Text); 是要写入批处理文件的字符串。
  • 这很可爱,但是@batfile ?
  • 您无法通过代码执行的批处理文件是什么?您可以将以下行添加到批处理文件中:Del %0
  • @FJam:你不需要对像这样的普通变量使用@ 运算符。

标签: c# batch-file


【解决方案1】:

可能发生的情况是您设法在cmd.exe 进程可以读取和处理它之前删除 .bat 文件。在删除文件之前,您需要等待以 Process.Start 开始的过程完成。像这样:

using (var process = Process.Start(path)) {
    process.WaitForExit();
}

顺便说一句,我确实想知道为什么您觉得需要在不应该​​编写的目录中创建 .bat 文件。您可以轻松地在临时目录下创建 .bat 文件。如果您需要工作目录是不同的目录,那么您可以在启动进程时轻松指定。

【讨论】:

  • 哦,它是在该目录中创建的,因为它正在更改主机文件。在那个目录中。
  • 是的,但您不需要在那里创建 .bat 文件来执行此操作。只需让进程将该目录作为其工作目录即可。
  • 我虽然这会在更新中实现,但没有,特别是因为您现在可能会获得最多的报道,我想强调应该处置 Process。跨度>
  • @GrantThomas 抱歉,我没注意。我已经更新了我的答案,无耻地使用您提供的更正。不过,我确实赞成您的回答。我希望没关系。
  • @DavidHeffernan 根本不是问题,只是想尽责。 (:
【解决方案2】:

您很有可能在进程实际开始处理之前删除了文件。您应该存储Process.Start 返回的Process(作为一般规则,您永远不应忽略.NET 中操作的返回结果)并使用WaitForExit,然后然后删除文件。

using (var process = Process.Start(path)) {
  process.WaitForExit();
}

记住Process 是一次性的东西,忽略结果是一个更糟糕的主意。

【讨论】:

    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 2015-07-28
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多