Функция "MoveFile" в С# (Удалить файл после перезагрузки)

Мне нужен пример, который может позволить мне передать параметр

например. выполнение delete.exe/killme.txt

Поэтому он будет использовать "MoveFile" для удаления killme.txt после перезагрузки.

Хотя, пожалуйста, не предварительно скомпилированную версию MS, так как у него есть раздражающий отказ от ответственности, каждый раз, когда он запускается на другом компьютере.

Ответ 1

Вам потребуются объявления P/Invoke для MoveFileEx:

[Flags]
internal enum MoveFileFlags
{
    None = 0,
    ReplaceExisting = 1,
    CopyAllowed = 2,
    DelayUntilReboot = 4,
    WriteThrough = 8,
    CreateHardlink = 16,
    FailIfNotTrackable = 32,
}

internal static class NativeMethods
{
    [DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
    public static extern bool MoveFileEx(
        string lpExistingFileName,
        string lpNewFileName, 
        MoveFileFlags dwFlags);
}

И пример кода:

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

Ответ 2

Поскольку вы хотите выполнить это после перезагрузки в качестве требования, вы можете использовать API планировщика задач Windows. Вы можете вызвать это на С#, добавив ссылку на библиотеку типов TaskScheduler 1.1 библиотеки COM. Ниже приведен полный пример кода при запуске Notepad.exe при входе в систему.

Кроме того, здесь есть еще один ресурс: http://bartdesmet.net/blogs/bart/archive/2008/02/23/calling-the-task-scheduler-in-windows-vista-and-windows-server-2008- from управляемых тайцами-code.aspx

Вы можете вызвать системную команду DEL из командной строки Windows, потенциально с помощью этого кода.

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.