C++/CLI,.NET 2.0
// DeleteAfterRebootNET.cpp : main project file.
#include "stdafx.h"
#include "windows.h"
#define DEBUG
using namespace System;
int main(array ^args)
{
LPWSTR buff;
BOOL ret;
LPTSTR s;
if (args->Length < 2)
{
Console::WriteLine(L"darn F(ile)|D(irectory) filename1|directory1 filename2|directory2 filename3|directory3 ...");
return -1;
}
else
{
if (args[0]->ToLower() == "f")
{
int successed = 0, failed = 0;
for(int i=1;iLength;i++)
{
if (System::IO::File::Exists(args) == false)
{
Console::WriteLine("File {0} doesn't exist!",args);
failed++;
continue;
}
buff = new wchar_t[args->Length+1];
for(int j=0;jLength;j++)
buff[j]=args[j];
ret = MoveFileEx(buff,NULL,MOVEFILE_DELAY_UNTIL_REBOOT);
if ( ret == 0)
{
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,GetLastError(),0,(LPTSTR)&s,0,NULL) != 0)
{
Console::WriteLine("Error:delete file {0} failed!",args);
failed++;
Console::WriteLine(gcnew String(s));
continue;
}
}
else
{
Console::WriteLine("Successed delete file {0}!",args);
successed++;
}
}
Console::WriteLine("{0} file(s) processed,{1} successed, {2} failed.",args->Length-1,successed,failed);
#ifdef DEBUG
Console::ReadLine();
#endif
}
else if (args[0]->ToLower() == "d")
{
int successed = 0, failed = 0;
int dsuccessed = 0, dfailed = 0;
for(int i=1;iLength;i++)
{
if (System::IO::Directory::Exists(args) == false)
{
Console::WriteLine("Directory {0} doesn't exist!",args);
failed++;
continue;
}
String^ currdir = Environment::CurrentDirectory;
if (args->IndexOf(currdir) == -1)
args = currdir + "//" + args;
array ^files = System::IO::Directory::GetFiles(args);
//未考虑嵌套情况
for(int j=0;jLength;j++)
{
buff = new wchar_t[files[j]->Length+1];
for(int j=0;jLength;j++)
buff[j]=files[j];
ret = MoveFileEx(buff,NULL,MOVEFILE_DELAY_UNTIL_REBOOT);
if ( ret == 0)
{
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,GetLastError(),0,(LPTSTR)&s,0,NULL) != 0)
{
Console::WriteLine("error:delete file {0} failed!",args);
failed++;
Console::WriteLine(gcnew String(s));
continue;
}
}
else
{
Console::WriteLine("successed delete file {0}!",args);
successed++;
}
}
Console::WriteLine("{0} file(s) processed,{1} successed, {2} failed.",files->Length,successed,failed);
buff = new wchar_t[args->Length+1];
for(int j=0;jLength;j++);
ret = MoveFileEx(buff,NULL,MOVEFILE_DELAY_UNTIL_REBOOT);
if ( ret == 0)
{
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,GetLastError(),0,(LPTSTR)&s,0,NULL) != 0)
{
Console::WriteLine("error:delete directory {0} failed!",args);
dfailed++;
Console::WriteLine(gcnew String(s));
continue;
}
}
else
{
Console::WriteLine("successed delete directory {0}!",args);
dsuccessed++;
}
}
Console::WriteLine("{0} directory(s) processed,{1} successed,{2} failed.",args->Length-1,dsuccessed,dfailed);
#ifdef DEBUG
Console::ReadLine();
#endif
}
else
{
Console::WriteLine("unkown flag:{0}",args[1]);
return -2;
}
}
return 0;
}
VC 强制删除 in use 文件
本文介绍了一个使用C++/CLI实现的程序,该程序可以在系统重启时删除指定的文件或目录。通过调用MoveFileEx函数并设置MOVEFILE_DELAY_UNTIL_REBOOT标志来实现延迟删除。


被折叠的 条评论
为什么被折叠?



