2011-05-20 44 views
9

我需要一個例子,它可以讓我傳遞參數C#中的「MoveFile」函數(重啓後刪除文件)

例如,執行delete.exe /killme.txt

所以它會在重啓後使用「MoveFile」刪除killme.txt。

雖然請不要MS預編譯版本,因爲它有一個惱人的免責聲明,每當它運行在不同的計算機上。

+0

我們在這裏談論什麼「MoveFile」函數? – 2011-05-20 21:47:18

+0

@Jeff Mercado有一個名爲「movefile.exe」的MS應用程序,允許您在重啓時將文件標記爲刪除 – Jay 2011-05-20 21:48:50

+0

@Jeff:我相信他指的是[MOVEFILE_DELAY_UNTIL_REBOOT](http://msdn.microsoft.com/ en-us/library/aa365240(v = vs.85).aspx) – user7116 2011-05-20 21:49:06

回答

21

您將需要的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"); 
} 
+1

元評論:帶有'DelayUntilReboot'的'MoveFileEx'只會在*註冊表問題*上失敗,而不是刪除問題。 – user7116 2011-05-20 21:58:51

+1

+1。尼斯。我沒有一個方便的C#示例,但直接引用了API調用(請參閱我對原始問題的評論)。 – 2011-05-20 22:02:32

+0

優雅。我不知道在使用現有Windows API重新啓動後可能會延遲文件刪除,而不使用某種Task Scheduler。 +1 – 2011-05-20 22:27:00

6

因爲要作爲一項要求重新啓動後才能執行此,你可以使用Windows任務計劃程序API。您可以在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

你可以從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命令。

+0

製作謝謝:) – Jay 2011-05-20 23:01:31

+0

+1,適合安排任何事情。 – user7116 2011-05-21 00:46:32

+0

'版權所有(c)DCOM製作。保留所有權利。該聲明引起了使用此代碼的法律問題。 – Nate 2013-06-27 19:24:58