[英]Marking files for deletion using MoveFileEx
我在使MoveFileEx在Windows 7 x64中正常工作時遇到了一些麻煩。
我以管理員身份運行應用程序,將文件標記為下次重新啟動時要刪除,但是重新啟動后發現沒有文件被刪除。
我正在使用以下方法來完成上述任務:
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags);
private static IEnumerable<string> GetFiles(string path)
{
var queue = new Queue<string>();
queue.Enqueue(path);
while (queue.Count > 0)
{
path = queue.Dequeue();
try
{
foreach (var subDir in Directory.GetDirectories(path))
{
queue.Enqueue(subDir);
}
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
}
string[] files = null;
try
{
files = Directory.GetFiles(path);
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
}
if (files != null)
{
foreach (var t in files)
{
yield return t;
}
}
}
}
private void button1_Click(object sender, EventArgs e)
{
foreach (var files in GetFiles(sysRoot + @"\system32\spool\drivers\x64\"))
{
Log(files);
MoveFileEx(files, null, MoveFileFlags.MovefileDelayUntilReboot);
}
}
我可以驗證標記過程是在多個文件上完成的,只是無法弄清楚為什么在重新啟動計算機后不執行刪除功能。
在這方面的任何幫助將不勝感激。
謝謝。
您正在犯一個非常經典的winapi錯誤。 您將SetLastError屬性設置為true,但實際上不檢查函數是否失敗。 像這樣修改您的代碼:
if (!MoveFileEx(files, null, MoveFileFlags.MovefileDelayUntilReboot)) {
throw new System.ComponentModel.Win32Exception();
}
現在,您將知道為什么失敗。
如果這些是機器啟動后立即加載的驅動程序文件,則由於它們已打開/正在使用中,因此可能無法刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.