簡體   English   中英

使用MoveFileEx將文件標記為刪除

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM