&引用;“移动文件”;C#中的函数(重新启动后删除文件)

&引用;“移动文件”;C#中的函数(重新启动后删除文件),c#,.net,windows,C#,.net,Windows,我需要一个例子,可以让我传递一个参数 e、 g.执行delete.exe/killme.txt 因此,它将使用“MoveFile”在重新启动后删除killme.txt 尽管请不要使用MS预编译版本,因为它有一个恼人的免责声明,每次它在不同的计算机上运行时。您需要p/Invoke声明: 以及一些示例代码: if (!NativeMethods.MoveFileEx("a.txt", null, MoveFileFlags.DelayUntilReboot)) { Console.Error

我需要一个例子,可以让我传递一个参数

e、 g.执行delete.exe/killme.txt

因此,它将使用“MoveFile”在重新启动后删除killme.txt


尽管请不要使用MS预编译版本,因为它有一个恼人的免责声明,每次它在不同的计算机上运行时。

您需要p/Invoke声明:

以及一些示例代码:

if (!NativeMethods.MoveFileEx("a.txt", null, MoveFileFlags.DelayUntilReboot))
{
    Console.Error.WriteLine("Unable to schedule 'a.txt' for deletion");
}

由于需要在重新启动后执行此操作,因此可以使用Windows任务计划程序API。您可以在C#中通过添加对COM库TaskScheduler 1.1类型库的引用来调用它。下面是登录时运行Notepad.exe的完整代码示例

此外,这里还有另一个资源:

您可以从Windows命令行调用系统命令DEL,可能使用以下代码

namespace TaskSchedulerExample {
    using System;
    using TaskScheduler;

    class Program {
        static void Main(string[] args) {
            var scheduler = new TaskSchedulerClass();
            scheduler.Connect(null, null, null, null);

            ITaskDefinition task = scheduler.NewTask(0);
            task.RegistrationInfo.Author = "DCOM Productions";
            task.RegistrationInfo.Description = "Demo";

            ILogonTrigger trigger = (ILogonTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_LOGON);
            trigger.Id = "Logon Demo";

            IExecAction action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);
            action.Id = "Delete";
            action.Path = "c:\\delete.exe";          // Or similar path
            action.WorkingDirectory = "c:\\";        // Working path
            action.Arguments = "c:\\killme.txt";     // Path to your file

            ITaskFolder root = scheduler.GetFolder("\\");
            IRegisteredTask regTask = root.RegisterTaskDefinition("Demo", task, (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE, null, null, _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, "");

            //Force run task
            //IRunningTask runTask = regTask.Run(null);
        }
    }
}

这给了您一些灵活性。您可以运行自己的delete.exe,也可以调用Windows命令行来执行DEL命令。

我们在这里讨论的是什么“MoveFile”函数?@Jeff Mercado有一个名为“MoveFile.exe”的MS应用程序它允许您在上标记要删除的文件reboot@Jeff:我相信他指的是@sixlettervariables,这是我不得不问的问题,因为尽管有一个API函数,但你让它听起来像是在谈论一个程序。正如@six所指出的,API可以为您做到这一点。元注释:
MoveFileEx
with
DelayUntilReboot
只会在注册表问题上失败,而不会在删除问题上失败。+1。美好的我手边没有C#示例,但直接引用了API调用(请参阅我对原始问题的评论)。我不知道在使用现有Windows API重新启动后,您可以延迟文件删除,并且不使用某种任务计划程序+1+1. 似乎需要管理员权限。它将失败而不引发异常,因此您需要查看GetLastError()返回的值。如果我想在重新启动时移动超过1个文件,该怎么办?对于多个文件,这是可能的还是存在另一个很好的解决方法?
版权(c)DCOM产品。保留所有权利。
?该声明在使用该代码时产生了法律问题。我拥有该公司,所以不是真的,但我不应该发布版权标题。习惯的力量。享受代码:)
namespace TaskSchedulerExample {
    using System;
    using TaskScheduler;

    class Program {
        static void Main(string[] args) {
            var scheduler = new TaskSchedulerClass();
            scheduler.Connect(null, null, null, null);

            ITaskDefinition task = scheduler.NewTask(0);
            task.RegistrationInfo.Author = "DCOM Productions";
            task.RegistrationInfo.Description = "Demo";

            ILogonTrigger trigger = (ILogonTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_LOGON);
            trigger.Id = "Logon Demo";

            IExecAction action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);
            action.Id = "Delete";
            action.Path = "c:\\delete.exe";          // Or similar path
            action.WorkingDirectory = "c:\\";        // Working path
            action.Arguments = "c:\\killme.txt";     // Path to your file

            ITaskFolder root = scheduler.GetFolder("\\");
            IRegisteredTask regTask = root.RegisterTaskDefinition("Demo", task, (int)_TASK_CREATION.TASK_CREATE_OR_UPDATE, null, null, _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, "");

            //Force run task
            //IRunningTask runTask = regTask.Run(null);
        }
    }
}