2011-05-20 13 views
9

Estoy en la necesidad de un ejemplo, que puede dejarme pasar un parámetrofunción "MoveFile" en C# (Eliminar archivo después de reiniciar)

por ejemplo, ejecutando delete.exe /killme.txt

Entonces usará "MoveFile" para eliminar killme.txt después del reinicio.

Aunque no sea la versión precompilada de MS, ya que tiene un descargo de responsabilidad molesto, cada vez que se ejecuta en una computadora diferente.

+0

¿De qué función "MoveFile" estamos hablando aquí? –

+0

@Jeff Mercado Hay una aplicación MS llamada "movefile.exe" que le permite marcar un archivo para eliminar al reiniciar – Jay

+0

@Jeff: Creo que se está refiriendo a [MOVEFILE_DELAY_UNTIL_REBOOT] (http://msdn.microsoft.com/ es-us/library/aa365240 (v = vs.85) .aspx) – user7116

Respuesta

21

Necesitará el P/Invoke declaraciones de 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); 
} 

Y un código de ejemplo:

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

Meta comentario: 'MoveFileEx' con' DelayUntilReboot' solo fallará en * un problema de registro * en lugar de un problema de eliminación. – user7116

+1

+1. Bonito. No tenía un ejemplo de C# a mano, pero tenía la referencia a la llamada de API directamente (vea mi comentario a la pregunta original). –

+0

Elegante. No sabía que podía retrasar la eliminación de un archivo después de reiniciar con la API de Windows existente y no utilizar algún tipo de Programador de tareas. +1 –

6

Debido a que desea realizar esto después de iniciar el sistema como un requisito, se puede usar la API del Programador de tareas de Windows. Puede invocar esto en C# agregando una referencia a la biblioteca COM Biblioteca de tipos de TaskScheduler 1.1. A continuación se muestra un ejemplo de código completo sobre la ejecución de Notepad.exe en el inicio de sesión.

Además, aquí es otro recurso: http://bartdesmet.net/blogs/bart/archive/2008/02/23/calling-the-task-scheduler-in-windows-vista-and-windows-server-2008-from-managed-code.aspx

que se podría llamar el comando del sistema DEL desde línea de comandos de Windows, potencialmente con este código.

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); 
     } 
    } 
} 

Esto le da cierta flexibilidad. Podría ejecutar su propio delete.exe, o podría invocar la línea de comandos de Windows para ejecutar el comando DEL.

+0

Productions Gracias :) – Jay

+0

+1, bueno para programar cualquier cosa. – user7116

+0

'Copyright (c) DCOM Productions. Todos los derechos reservados.? Esa declaración crea problemas legales con el uso de este código. – Nate

Cuestiones relacionadas