Функция MoveFile в C # (удаление файла после перезагрузки) - PullRequest
11 голосов
/ 21 мая 2011

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

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

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

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

Ответы [ 2 ]

23 голосов
/ 21 мая 2011

Вам понадобятся объявления 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");
}
6 голосов
/ 21 мая 2011

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

Также, есть еще один ресурс: http://bartdesmet.net/blogs/bart/archive/2008/02/23/calling-the-task-scheduler-in-windows-vista-and-windows-server-2008-from-managed-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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...