как пометить папки для удаления C #

Как мне пометить одну папку для удаления при перезагрузке системы, используя C #.

Спасибо,

 Josh Stodola17 июн. 2009 г., 21:38
Задайте вопрос здесь, и пусть куча других людей найдет его для вас и вставит свои немедленные результаты. Логическое!
 Jason Williams17 июн. 2009 г., 16:06
Смотрите ответ ниже - это Win32 API, который вызывается из C # через P / Invoke.
 John Saunders17 июн. 2009 г., 16:18
@ Джейсон: Круто, спасибо. Я знал, что MoveFile может быть отложен, но не знал, что его можно использовать для удаления.
 John Saunders17 июн. 2009 г., 15:59
В общем, я не знал, что Windows вообще имела такую возможность, а тем более в C #. Как бы вы сделали это на родном Win32?

Ответы на вопрос(4)

http://abhi.dcmembers.com/blog/2009/03/24/mark-file-for-deletion-on-reboot/ :

///
/// Consts defined in WINBASE.H
///
internal enum MoveFileFlags
{
    MOVEFILE_REPLACE_EXISTING = 1,
    MOVEFILE_COPY_ALLOWED = 2,
    MOVEFILE_DELAY_UNTIL_REBOOT = 4,
    MOVEFILE_WRITE_THROUGH  = 8
}


/// <summary>
/// Marks the file for deletion during next system reboot
/// </summary>
/// <param name="lpExistingFileName">The current name of the file or directory on the     local computer.</param>
/// <param name="lpNewFileName">The new name of the file or directory on the local   computer.</param>
/// <param name="dwFlags">MoveFileFlags</param>
/// <returns>bool</returns>
/// <remarks>http://msdn.microsoft.com/en-us/library/aa365240(VS.85).aspx</remarks>
[System.Runtime.InteropServices.DllImportAttribute("kernel32.dll",EntryPoint="MoveFileEx")]
internal static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName,
MoveFileFlags dwFlags);

//Usage for marking the file to delete on reboot
MoveFileEx(fileToDelete, null, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);

Редактирование: избитый

что при использовании MOVEFILE_DELAY_UNTIL_REBOOT с MoveFileEx будут удаляться только пустые папки. Ссылка на документацию.

Мое решение заключается в следующем: каждый файл в каталоге & quot; удален & quot; с MoveFileEx с MOVEFILE_DELAY_UNTIL_REBOOT, а затем каталог & quot; удален & quot; так же.

public class Cleanuper
{
    private void PendingDeleteDirectory(string directoryPath)
    {
        foreach (string directory in Directory.GetDirectories(directoryPath, "*", SearchOption.TopDirectoryOnly))
        {
            PendingDeleteDirectory(directory);
        }

        foreach (string file in Directory.GetFiles(directoryPath, "*", SearchOption.TopDirectoryOnly))
        {
            NativeMethods.MoveFileEx(file, null, MoveFileFlags.DelayUntilReboot);
        }
        NativeMethods.MoveFileEx(directoryPath, null, MoveFileFlags.DelayUntilReboot);
    }
}

public static class NativeMethods
{
    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    internal static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags);
}

[Flags]
public enum MoveFileFlags
{
    DelayUntilReboot = 0x00000004
}
Решение Вопроса

http://abhi.dcmembers.com/blog/2009/03/24/mark-file-for-deletion-on-reboot/

Документация:

https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-movefileexa#parameters

///
/// Consts defined in WINBASE.H
///
[Flags]
internal enum MoveFileFlags
{
    MOVEFILE_REPLACE_EXISTING = 1,
    MOVEFILE_COPY_ALLOWED = 2,
    MOVEFILE_DELAY_UNTIL_REBOOT = 4, //This value can be used only if the process is in the context of a user who belongs to the administrators group or the LocalSystem account
    MOVEFILE_WRITE_THROUGH  = 8
}


/// <summary>
/// Marks the file for deletion during next system reboot
/// </summary>
/// <param name="lpExistingFileName">The current name of the file or directory on the local computer.</param>
/// <param name="lpNewFileName">The new name of the file or directory on the local computer.</param>
/// <param name="dwFlags">MoveFileFlags</param>
/// <returns>bool</returns>
/// <remarks>http://msdn.microsoft.com/en-us/library/aa365240(VS.85).aspx</remarks>
[System.Runtime.InteropServices.DllImportAttribute("kernel32.dll",EntryPoint="MoveFileEx")]
internal static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName,
MoveFileFlags dwFlags);

//Usage for marking the file to delete on reboot
MoveFileEx(fileToDelete, null, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);
 14 дек. 2015 г., 04:53
Чтобы похвалить хороший ответ,[Flags] отсутствует наMoveFileFlags. +1
 22 янв. 2019 г., 15:34
The documentation states дляMOVEFILE_DELAY_UNTIL_REBOOT параметр: & quot;…This value can be used only if the process is in the context of a user who belongs to the administrators group or the LocalSystem account…& Quot ;.
 16 мая 2017 г., 23:43
Проблема в том, что при использовании MOVEFILE_DELAY_UNTIL_REBOOT с MoveFileEx будут удаляться только пустые папки.msdn.microsoft.com/en-us/library/windows/desktop/…, Таким образом, вам нужно удалить и установить для удаления всех файлов и подпапок внутри папки и только затем удалять папку.

Используйте PInvoke и вызовите MoveFileEx, передав NULL в качестве пункта назначения ....

Эта ссылка имеет некоторый пример кода:

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
public static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, int dwFlags);

public const int MOVEFILE_DELAY_UNTIL_REBOOT = 0x4;

MoveFileEx(filename, null, MOVEFILE_DELAY_UNTIL_REBOOT);

Ваш ответ на вопрос