执行一个文件,等待其结束后将其删除 VC++
最近我遇到一个问题,就是选择一个文件将其打开,等打开的文件关闭后再将这个文件删除。实在不知道怎么办?我也想了一些方案,但总是不完美。用VC++开发。
第一个方案:
用ShellExecuteEx来执行。但总是不行,这样会有一个后果是什么呢?一个png或bmp的文件没办法打开。
代码如下:
SHELLEXECUTEINFO appInfo;
ZeroMemory(&appInfo, sizeof(SHELLEXECUTEINFO));
appInfo.cbSize = sizeof(SHELLEXECUTEINFO);
appInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_DDEWAIT;
appInfo.lpVerb = L"open";
appInfo.lpFile = lpFilePath.c_str();
appInfo.nShow = SW_SHOWDEFAULT;
// open the decrypted file
BOOL bResult = ShellExecuteEx(&appInfo);
if ( bResult )
{
if ( NULL != appInfo.hProcess )
{
DWORD dwRes = WaitForSingleObject(appInfo.hProcess, INFINITE);
CloseHandle(appInfo.hProcess);
}
}
// delete the destination file which temporary decrypted
deleteFiles(lpFilePath, FALSE);这样会有问题,appInfo.hProcess 如果为NULL的话,那么程序就不会等待。而ShellExecuteEx的appInfo.hProcess 有可能为NULL,所以这种方式就会存在问题。比如一个.png, .bmp文件就没办法。对于.png, .bmp文件,是打开了的,由于等待不起作用,继续往下执行,就会把文件删除,因此就会说找不到图片。
第二种方案:
根据文件名的后缀去读注册表,找到这个文件关联的打开方式。即到shell\command下的打开方式,再行成命令行commandline,创建一个进程。代码如下:
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
STARTUPINFO si = {sizeof(si)};
BOOL bResult = CreateProcess(NULL,
chCommandLine,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi);
if ( !bResult )
{
DWORD dwErrorCode = GetLastError();
FPString str(L"Create Process failed");
str.append(getErrorCodeString(dwErrorCode));
MessageBoxW(NULL, str.c_str(), L"Error", MB_OK | MB_ICONERROR);
}
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
// delete the destination file which temporary decrypted
deleteFiles(lpFileInfos, FALSE);这会有个问题,.png, .bmp的命令行是一个DLL,如:%systemroot%\system32\rundll32.exe "%programfiles%\windows photo gallery\photoviewer.dll", imageview_fullscreen %1 就样创建进程就会失败,而打开方式是EXE的没问题,如WORD等。
朋友们,遇到过这个问题的帮给个建议!小弟不胜感激!
相关推荐
图解安装VC++6图解安装VC++6
图解安装VC++6图解安装VC++6图解安装VC++6图解安装VC++6图解安装VC++6图解安装VC++6图解安装VC++6
VC++实例:如何创建临时文件
是一个C++标准库函数,定义在<cstdio>(C++17之前为<cstdio>)头文件中。它用于创建一个临时的二进制文件,该文件会在关闭时(通常是文件流对象被销毁时)自动删除。这是因为它通常会创建一个模式为 "wb+" 的文件,即以写入二进制模式打开,文件会先被截断(如果文件已存在),如果文件不存在则会创建一个新文件。return 1;// 使用tmp进行文件操作...// 当tmp离开作用域时,文件会自动被删除return 0;
VC++文件管理操作实战指南
direct.h><direct.h>头文件中最常用的函数是mkdir,它用于创建一个新目录。此外,还有rmdir函数用于删除一个空目录。尽管这些函数在一些现代操作系统中已不常使用,或者被更高级的函数替代,但在特定场景或旧系统维护时,这些函数依然有其价值。fstream。
掌握VC++环境下的临时文件管理与优化
在计算机科学中,临时文件通常指在程序执行过程中生成,用于存储暂时性的数据,并在程序结束或系统清理时会被删除的文件。临时文件对于程序运行来说至关重要,因为它们可以减少对主内存的需求,并有助于避免频繁的磁盘I/O操作。临时文件可以在许多不同的情况下生成,例如,系统管理、应用软件运行、编译过程和网络通信等。在处理临时文件这一常见而又棘手的问题时,自动化清理工具可谓是IT从业者的得力助手。这些工具通过简单的配置,可以在不影响日常工作的同时,有效管理临时文件,提高系统运行效率。
VC++调用winrar
VC++如何调用winrar,及winrar命令


进程/线程/DLL
