我需要一個例子,它可以讓我傳遞參數C#中的「MoveFile」函數(重啓後刪除文件)
例如,執行delete.exe /killme.txt
所以它會在重啓後使用「MoveFile」刪除killme.txt。
雖然請不要MS預編譯版本,因爲它有一個惱人的免責聲明,每當它運行在不同的計算機上。
我需要一個例子,它可以讓我傳遞參數C#中的「MoveFile」函數(重啓後刪除文件)
例如,執行delete.exe /killme.txt
所以它會在重啓後使用「MoveFile」刪除killme.txt。
雖然請不要MS預編譯版本,因爲它有一個惱人的免責聲明,每當它運行在不同的計算機上。
您將需要的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");
}
元評論:帶有'DelayUntilReboot'的'MoveFileEx'只會在*註冊表問題*上失敗,而不是刪除問題。 – user7116 2011-05-20 21:58:51
+1。尼斯。我沒有一個方便的C#示例,但直接引用了API調用(請參閱我對原始問題的評論)。 – 2011-05-20 22:02:32
優雅。我不知道在使用現有Windows API重新啓動後可能會延遲文件刪除,而不使用某種Task Scheduler。 +1 – 2011-05-20 22:27:00
因爲要作爲一項要求重新啓動後才能執行此,你可以使用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」函數? – 2011-05-20 21:47:18
@Jeff Mercado有一個名爲「movefile.exe」的MS應用程序,允許您在重啓時將文件標記爲刪除 – Jay 2011-05-20 21:48:50
@Jeff:我相信他指的是[MOVEFILE_DELAY_UNTIL_REBOOT](http://msdn.microsoft.com/ en-us/library/aa365240(v = vs.85).aspx) – user7116 2011-05-20 21:49:06